咨询区
-
robr
我用代码动态的打开了一个 IE
进程,参考如下代码:
static void Main(string[] args)
{
ProcessStartInfo startInfo = new ProcessStartInfo("iexplore.exe");
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = "http://www.google.com";
Process ieProcess = Process.Start(startInfo);
}
代码运行后,在 任务管理器
上会有两个进程,现在我尝试通过下面的方法去 kill
它。.
ieProcess.Kill();
我发现 kill 不干净,应该是这个进程的附属子进程无法被销毁,请问这种情况我该如何去处理呢?
回答区
-
Cyprien Autexier
如果 kill 主进程之后,让附属的子进程也可以自动销毁的话,大概有2种解决办法。
-
使用 ManagementObjectSearcher
通过指定的 pid
获取所有进程(包括子进程),再进行统一 kill,参考如下代码:
/// <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.
}
}
-
process.kill(true)
方式
如果你是 .NET Core 3.0
以上的项目,在框架中已经内置了 boolean 类型的 Kill
方法重载,签名如下:
//
// Parameters:
// entireProcessTree:
// true to kill the associated process and its descendants; false to kill only the
// associated process.
//
public void Kill(bool entireProcessTree);
然后就可以再改造一下。
static void Main(string[] args)
{
ProcessStartInfo startInfo = new ProcessStartInfo("iexplore.exe");
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = "http://www.google.com";
Process ieProcess = Process.Start(startInfo);
ieProcess.Kill(true);
}
点评区
Kill
方法重载的这个很不错,框架越来越强大,学习了。