如何在没有“进程退出”exception的情况下杀死进程?
我使用Process.Kill()
来杀死进程。 像这样:
if( !process.WaitForExit( 5000 ) ) { process.Kill(); }
有时进程将在行之间退出,因此if
Kill
将导致exception,则控制将进入内部:
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
。
有没有办法在所描述的场景中杀死进程而不会出现exception?
你可以P / Invoke TerminateProcess
传递它Process.Handle
。 然后手动评估它的原因( GetLastError()
)。 这大致就是Process.Kill()
内部的作用。
但请注意, TerminateProcess
是异步的。 因此,您必须等待进程句柄以确保完成。 使用 Process.Kill()
为您做到这一点。
更新:更正, Process.Kill()
也异步运行。 所以你必须使用WaitForExit()
等待终止完成 – 如果你在意的话。
坦率地说,我不会打扰。 当然,总是存在(远程?)机会,某些“任意”的InvalidOperationExcepion
从该行代码中冒出来,这与不再存在的Process
或Process
对象处于无效状态无关,而是现实我认为你可以选择围绕Kill
的尝试/捕捉。
此外,根据您的应用程序,您可以考虑记录此杀死,因为它似乎是某种最后的措施。 在这种情况下,使用它记录实际的InvalidOperationException
。 如果事情变得奇怪,你至少要用你的日志来检查Kill
失败的原因。
尽管如此,您可能还需要考虑捕获/处理Win32Exception
,原因相同。
你需要使用HasExited
:
if(!process.WaitForExit(5000)) { if (!process.HasExited) { process.Kill(); } }
看这里:
http://msdn.microsoft.com/en-us/library/system.diagnostics.process.hasexited.aspx