如何在使用process . exit时避免竞争条件
本文关键字:竞争 条件 exit process | 更新日期: 2023-09-27 18:11:04
我想写一个方法,等待进程死亡,然后执行一些动作。我下面的第一个草稿有一个竞争条件,其中,如果进程在我检查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(); };
}
}
首先附加事件处理程序,然后检查它是否已退出。此外,要防止处理程序的双重调用(这里需要同步,因为Exit事件可能与第二次检查同时触发)。
使用Reflector,我得到的印象是,如果进程已经退出,Exit
将立即触发。因此,甚至可能不存在竞争条件。但是我在文档中找不到确认。