c# - 检测所有子进程是否关闭

标签 c# process

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

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

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

还有其他解决方案吗?

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

最佳答案

您可以使用计时器或任务创建(例如):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;
        }) ;

你可以只做一个 while 循环来测试 var 结果,等待结果为 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));

关于c# - 检测所有子进程是否关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53501968/

相关文章:

c# - 开启一个真表达式 c#

c# - 使用 ScreenCapture.CaptureScreenshot 捕获并保存屏幕截图

c# - 如何仅终止由我的应用程序启动的进程

c - 检测 FFmpeg 是否正在运行或已停止运行

c# - 在 C# 中计算 Matlab .m 文件

c# - 向 DataTable 添加多行

qt - QProcess::close() 是否会在进程上引发 unix SIGTERM 信号?

c - 将 SA_NOCLDWAIT 设置为 SIGCHLD 后的 Linux system()

android - 线程出现 ANR 错误

c# - 证书吊销列表 c#