如何在没有“进程退出”异常的情况下终止进程?

时间:2012-11-26 12:13:59

标签: c# .net process

我使用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可以出于其他原因被调用。

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

2 个答案:

答案 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