我使用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
可以出于其他原因被调用。
有没有办法在所描述的场景中杀死进程而不会出现异常?
答案 0 :(得分:9)
您可以P / Invoke TerminateProcess
传递Process.Handle
。然后手动评估其原因(GetLastError()
)。这大致是Process.Kill()
内部的作用。
但请注意TerminateProcess
是异步的。因此,您必须等待进程句柄以确保完成。 使用 Process.Kill()
为您的。
更新:更正,Process.Kill()
也以异步方式运行。所以你必须使用WaitForExit()
等待终止才能完成 - 如果你愿意的话。
InvalidOperationExcepion
冒出该代码行,这与不再存在的进程或Process
对象无关处于无效状态,但实际上我认为你可以使用Kill
周围的try / catch。
此外,根据您的应用程序,您可以考虑记录此杀死,因为它似乎是某种最后的手段。在这种情况下,使用它记录实际的InvalidOperationException
。如果事情变得奇怪,你至少要让你的日志来检查Kill
失败的原因。
尽管如此,您可能还需要考虑以相同的原因捕获/处理Win32Exception
。
答案 1 :(得分:3)
您需要使用HasExited
:
if(!process.WaitForExit(5000))
{
if (!process.HasExited)
{
process.Kill();
}
}
见这里:
http://msdn.microsoft.com/en-us/library/system.diagnostics.process.hasexited.aspx