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

C# 检测是否所有子进程都已关闭,c#,process,C#,Process,在我的应用程序中,用户可以通过单击按钮来启动visual studio代码进程(单击按钮后将其禁用)。现在我想检测一下,当它被退出事件关闭时。在启动流程之前,我必须检查是否已经有一个实例正在运行,因为接下来我必须将正在运行的流程订阅到Exited-事件(如果我订阅了新流程,它将立即触发) 问题是,如果启动VS代码的一个实例,则有5个“子进程”,因此我必须检测它们是否都已关闭,然后才能再次启用该按钮。退出事件后,并非所有进程都立即完成 其中一个解决方案是Thread.Sleep(500),但在我看

在我的应用程序中,用户可以通过单击按钮来启动visual studio代码进程(单击按钮后将其禁用)。现在我想检测一下,当它被退出事件关闭时。在启动流程之前,我必须检查是否已经有一个实例正在运行,因为接下来我必须将正在运行的流程订阅到
Exited
-事件(如果我订阅了新流程,它将立即触发)

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

其中一个解决方案是Thread.Sleep(500)
,但在我看来,这不是一个很好的解决方法

还有别的解决办法吗


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

您可以使用计时器或任务(例如)创建:process.getprocesss()并每秒测试一次如果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;
        }) ;

你看过这个吗,(),它可能会帮助你知道子进程的名称?我有ID和进程名称,是的
        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));