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 事件可能与第二次检查同时触发)。

使用反射器,Exit如果进程已经退出,我会立即触发。所以甚至可能没有竞争条件。不过,我在文档中找不到确认。

于 2013-04-27T14:53:12.403 回答