我用 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
可以因其他原因而被召唤。
有没有办法在所描述的场景中杀死进程而不会出现异常?
你可以P / Invoke TerminateProcess
通过它 Process.Handle
。然后手动评估其原因(GetLastError()
)。什么是粗略的 Process.Kill()
在内部。
但请注意 TerminateProcess
是异步的。因此,您必须等待进程句柄以确保完成。 运用 Process.Kill()
这样做是为了你的。
更新: 更正, Process.Kill()
也是异步运行的。所以你必须使用 WaitForExit()
等待终止完成 - 如果你在意的话。
坦率地说,我不会打扰。当然总有(遥远的)机会有些“随意” InvalidOperationExcepion
从那行代码中冒出来,这与流程不再存在或与之相关 Process
对象处于无效状态,但实际上我认为你可以随身携带try / catch 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