如何在使用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(); };    
        }            
    }

如何在使用process . exit时避免竞争条件

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

使用Reflector,我得到的印象是,如果进程已经退出,Exit将立即触发。因此,甚至可能不存在竞争条件。但是我在文档中找不到确认。