0

プロセスが終了するのを待ってからアクションを実行するメソッドを書きたいと思います。以下の最初のドラフトには競合状態があり、Exitedイベントをチェックした後にプロセスが終了した場合、アクションは決して実行されません。このメソッドを正しく書き直す最も雄弁な方法は何ですか?

private void MonitorProcess(int processId, Action doOnExit)
    {
        Process process = Process.GetProcessById(processId);

        if (process.HasExited)
        {
            doOnExit();
        }
        else
        {
            process.EnableRaisingEvents = true;
            process.Exited += delegate { doOnExit(); };    
        }            
    }
4

1 に答える 1

2

最初にイベント ハンドラーをアタッチしてから、それが終了したかどうかを確認します。さらに、ハンドラーの二重呼び出しを防止します (Exit イベントが 2 番目のチェックと同時に発生する可能性があるため、ここで同期する必要があります)。

Reflector を使用するとExit、プロセスが既に終了している場合にすぐに起動するという印象を受けます。したがって、競合状態さえないかもしれませんただし、ドキュメントで確認を見つけることができませんでした。

于 2013-04-27T14:53:12.403 に答える