检测是否所有子进程都已关闭

时间:2018-11-27 14:31:22

标签: c# process

在我的应用程序中,用户可以通过单击按钮(单击后被禁用)来启动Visual Studio代码过程。现在,我想检测何时Exited事件将其关闭。在开始该过程之前,我必须检查是否已经有一个实例在运行,因为这之后我必须将正在运行的过程预订到Exited事件(如果我将新过程预订到该事件,它将立即被触发)。

问题是,如果您启动一个VS代码实例,则有5个“子进程”,因此我必须先检测它们是否都已关闭,然后才能再次启用该按钮。在Exited事件之后,并非所有过程都会立即完成。

一个解决方案是Thread.Sleep(500),但我认为这不是解决问题的好方法。

还有其他解决方法吗?

编辑:主要任务是检测进程是否正在关闭。

1 个答案:

答案 0 :(得分:0)

您可以使用计时器或任务(例如)创建:Process.GetProcesses()并每秒检查一次process.id是否再次存在,您只需创建ID列表即可使用已知ID进行测试

        var pidlist = new List<int>() { 8, 3, 6300 };
        Process[] processes = Process.GetProcesses();
        var result = processes.Select(x => x.Id).Any(pid =>
        {
            if (pidlist.Contains(pid)) return true;
            return false;
        }) ;

您可以对var结果的测试进行一次while循环,然后等待结果为false。

        var pidlist = new List<int>() { 8, 2952, 630 };
        bool result = true;
        while (result)
        {
            Process[] processes = Process.GetProcesses();
            result = processes.Select(x => x.Id).Any(pid =>
            {
                if (pidlist.Contains(pid)) return true;
                return false;
            });
            System.Threading.Thread.Sleep(1000);
        }

如果需要,您可以简化计算结果

result = processes.Select(x => x.Id).Any(pid => pidlist.Contains(pid));