在C#中以编程方式杀死进程树
我正在使用以下代码以编程方式启动Internet Explorer:
ProcessStartInfo startInfo = new ProcessStartInfo("iexplore.exe");startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = "http://www.google.com";
Process ieProcess = Process.Start(startInfo);
这将生成2个在Windows任务管理器中可见的进程。然后,我尝试使用以下方法终止该进程:
ieProcess.Kill();
这导致任务管理器中的一个进程被关闭,而另一个保持不变。我尝试检查任何具有子进程的属性,但均未找到。我如何也可以杀死其他进程?更一般而言,如何杀死与以Process.Start开始的进程相关的所有进程?
回答:
这对我来说非常有效:
/// <summary>/// Kill a process, and all of its children, grandchildren, etc.
/// </summary>
/// <param name="pid">Process ID.</param>
private static void KillProcessAndChildren(int pid)
{
// Cannot close 'system idle process'.
if (pid == 0)
{
return;
}
ManagementObjectSearcher searcher = new ManagementObjectSearcher
("Select * From Win32_Process Where ParentProcessID=" + pid);
ManagementObjectCollection moc = searcher.Get();
foreach (ManagementObject mo in moc)
{
KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
}
try
{
Process proc = Process.GetProcessById(pid);
proc.Kill();
}
catch (ArgumentException)
{
// Process already exited.
}
}
回答:
在Visual Studio 2015 Update 2
上进行了测试Win7 x64
。现在仍然像3年前一样运作良好。
回答:
添加了对系统空闲过程的检查 if (pid == 0)
回答:
需要添加对System.Management
命名空间的引用,请参见下面的@MinimalTech的注释。如果您安装了ReSharper,它将自动为您执行此操作。
回答:
最常见的用例是杀死我们自己的C#进程已启动的所有子进程。
在这种情况下,更好的解决方案是在C#中使用Win32调用,使所有生成的进程成为子进程。这意味着在退出父进程时,Windows将自动关闭所有子进程,从而无需使用上面的代码。如果您要我发布代码,请告诉我。
以上是 在C#中以编程方式杀死进程树 的全部内容, 来源链接: utcz.com/qa/414858.html