14

Process.Kill()用来杀死一个进程。像这样:

if( !process.WaitForExit( 5000 ) ) {
   process.Kill();
}

有时进程会在两行之间退出,因此控制会进入内部if,然后Kill会产生异常:

System.InvalidOperationException
Cannot process request because the process (ProcessIdHere) has exited.
at System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited)
at System.Diagnostics.Process.Kill()
//my code here

现在将代码包装到 try-catch 中似乎不是一个好主意,因为InvalidOperationException可以出于其他原因调用。

有没有办法在描述的场景中杀死一个进程而不会出现异常?

4

2 回答 2

12

你可以 P/InvokeTerminateProcess传递它Process.Handle。然后手动评估它的原因(GetLastError())。大致是,内部做什么Process.Kill()

但请注意,这TerminateProcess是异步的。所以你必须等待进程句柄以确保它完成。使用Process.Kill()为您做到这一点。

更新:更正,Process.Kill()也异步运行。所以你必须使用WaitForExit()等待终止完成 - 如果你在乎的话。

坦白说,我不会打扰。当然,总是有(远程?)一些“任意”的机会InvalidOperationExcepion从那行代码中冒出来,这与不再存在的进程或Process对象处于无效状态无关,但实际上我认为你可以在Kill.

此外,根据您的应用程序,您无论如何都可以考虑记录此杀戮,因为这似乎是某种最后的手段。在这种情况下,用它记录实际情况InvalidOperationException。如果事情变得奇怪,你至少有你的日志来检查Kill失败的原因。

Win32Exception说了这么多,出于同样的原因,您可能还想考虑捕获/处理。

于 2012-11-26T12:23:36.507 回答
6

您需要使用HasExited

if(!process.WaitForExit(5000)) 
{
   if (!process.HasExited)
   {
       process.Kill();
   }
}

看这里:

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.hasexited.aspx

于 2012-11-26T12:22:30.453 回答