I use Process.Kill() to kill a process. Like this:
if( !process.WaitForExit( 5000 ) ) {
process.Kill();
}
and sometimes the process will exit right in between the lines, so control will get inside if and then Kill will yield an 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
Now wrapping the code into try-catch doesn’t seem to be a good idea because InvalidOperationException can be called for other reasons.
Is there a way to kill a process without getting an exception in the described scenario?
You could P/Invoke
TerminateProcesspassing itProcess.Handle. Then manually evaluating the cause of it (GetLastError()). Which is roughly, whatProcess.Kill()does internally.But note that
TerminateProcessis asynchronous. So you’d have to wait on the process handle to be sure it is done.UsingProcess.Kill()does that for your.Update: Correction,
Process.Kill()also runs asynchronously. So you’ll have to useWaitForExit()to wait for termination to complete – if you care.Frankly, I wouldn’t bother. Of course there is always the (remote?) chance that some “arbitrary”
InvalidOperationExcepionbubbles up out of that line of code, that is not related to the process no longer being there or theProcessobject to be in an invalid state, but in reality I think you can just go with the try/catch around theKill.In addition, depending on your application, you could consider logging this kill anyway, since it seems some sort of last resort measure. In that case log the actual
InvalidOperationExceptionwith it. If things go strange, you at least have your logs to check why theKillfailed.Having all that said, you might also want to consider catching / handling
Win32Exceptionfor the same reasons.