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