使用Process.Exited时如何避免竞争条件

时间:2013-04-27 14:34:51

标签: c# windows process

我想写一个等待进程死然然后执行一些Action的方法。我的下面的第一个草案有一个竞争条件,其中,如果在检查Exited事件后进程已退出,我的Action将永远不会执行。重写这种方法最有说服力的方法是什么,这是正确的?

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

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

1 个答案:

答案 0 :(得分:2)

首先附加事件处理程序,然后检查它是否已退出。另外,要防止对你的处理程序进行双重调用(你需要在这里进行同步,因为Exit事件可能会与第二次检查同时触发)。

使用反射器如果进程已经退出,我会得到Exit立即触发的印象。所以甚至可能 一个竞争条件。但是,我在文档中找不到确认。