这对我来说非常有效:
/// <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. }}更新2016-04-26
在
Visual Studio 2015 Update 2上进行了测试
Win7 x64。现在仍然像3年前一样运作良好。
更新2017-11-14
添加了对系统空闲过程的检查
if (pid == 0)
更新2018-03-02
需要添加对
System.Management命名空间的引用,请参见下面的@MinimalTech的注释。如果您安装了ReSharper,它将自动为您执行此操作。
更新2018-10-10
最常见的用例是杀死我们自己的C#进程已启动的所有子进程。
在这种情况下,更好的解决方案是在C#中使用Win32调用,使所有生成的进程成为子进程。这意味着在退出父进程时,Windows将自动关闭所有子进程,从而无需使用上面的代码。如果您要我发布代码,请告诉我。



