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

3
在我的应用程序中,用户可以通过点击按钮启动Visual Studio Code进程(点击后会禁用它)。现在我想检测当其被Exited事件关闭时。在启动进程之前,我必须检查是否已经有一个实例正在运行,因为如果是这样,我必须将正在运行的进程订阅到Exited事件(如果我订阅新进程,则会立即触发)。问题是,如果您启动VS Code的一个实例,则会有5个“子进程”,因此在可以再次启用按钮之前,必须检测它们全部关闭。在Exited事件之后,并非所有进程都会立即完成。一个解决方案是Thread.Sleep(500),但我认为这不是一个好的解决方法。还有其他解决方案吗?编辑:主要任务是检测进程是否正在关闭。

你看过这个吗?(https://dev59.com/yG025IYBdhLWcg3wnXWg),它可能会帮助你。 - hessam hedieh
你知道子进程的名称吗? - Frenchy
我有ID和进程名称,是的。 - user10172226
1个回答

0
你可以用计时器或任务(例如)来创建:Process.GetProcesses(),然后每秒测试一次是否存在进程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;
        }) ;

你可以使用一个 while 循环,测试变量 result 并等待 result 变为 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));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接