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

sha*_*oth 11 .net c# process

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

if( !process.WaitForExit( 5000 ) ) {
   process.Kill();
}
Run Code Online (Sandbox Code Playgroud)

有时进程将在行之间退出,因此控件将进入内部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
Run Code Online (Sandbox Code Playgroud)

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

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

Chr*_*n.K 9

你可以P/Invoke TerminateProcess传递它Process.Handle.然后手动评估它的原因(GetLastError()).粗略地说,Process.Kill()内部是什么.

但请注意,这TerminateProcess是异步的.因此,您必须等待进程句柄以确保完成.使用Process.Kill()为你的.

更新:更正,Process.Kill()也是异步运行.所以你必须WaitForExit()等待终止才能完成 - 如果你关心的话.

坦率地说,我不会打扰.当然总是存在(远程?)机会,某些"任意" InvalidOperationExcepion冒出代码行,这与进程不再存在或Process对象处于无效状态无关,但实际上我认为你可以随身携带try/catch Kill.

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

尽管如此,您可能还需要考虑捕获/处理Win32Exception,原因相同.


Llo*_*oyd 6

您需要使用HasExited

if(!process.WaitForExit(5000)) 
{
   if (!process.HasExited)
   {
       process.Kill();
   }
}
Run Code Online (Sandbox Code Playgroud)

看这里:

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

  • 这仍然存在竞争条件。`HasExited` 可能返回 `false`,但是当 `Kill`​​ 执行时,该进程可能已经消失 - 仍然导致 `InvalidOperationException`。 (6认同)