【问题标题】:Detect if all sub processes are closed检测是否所有子进程都关闭
【发布时间】:2018-11-27 14:31:22
【问题描述】:

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

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

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

还有其他解决方案吗?

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

【问题讨论】:

标签: c# process


【解决方案1】:

您可以使用计时器或任务(例如)创建: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结果,等待结果为假。

        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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多