14

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

InvalidOperationExceptionコードをtry-catchにラップすることは、他の理由で呼び出される可能性があるため、良い考えではないようです。

説明されているシナリオで例外を取得せずにプロセスを強制終了する方法はありますか?

4

2 に答える 2

12

P/InvokeTerminateProcessを渡すことができProcess.Handleます。次に、その原因を手動で評価します ( GetLastError())。これは大まかに、Process.Kill()内部で何をするかです。

ただし、TerminateProcess非同期であることに注意してください。そのため、プロセス ハンドルが完了するまで待機する必要があります。を使用Process.Kill()すると、あなたのためにそれが行われます。

更新:訂正、Process.Kill()非同期でも実行されます。そのWaitForExit()ため、必要に応じて、終了が完了するまで待つ必要があります。

率直に言って、私は気にしません。もちろん、プロセスが存在しなくなったり、オブジェクトが無効な状態になっInvalidOperationExcepionたりすることとは関係ありませんが、そのコード行から「任意の」何かが発生する可能性は常に (リモート?) ありますが、実際には私はProcessの周りで try/catch を使用できると思いますKill

さらに、アプリケーションによっては、何らかの最後の手段のように思われるため、この kill をログに記録することを検討することもできます。その場合、実際のログを記録しますInvalidOperationException。異常な事態が発生した場合、少なくともログがあり、Kill失敗した理由を確認できます。

Win32Exceptionそうは言っても、同じ理由でキャッチ/ハンドリングを検討することもできます。

于 2012-11-26T12:23:36.507 に答える
6

使用する必要がありますHasExited

if(!process.WaitForExit(5000)) 
{
   if (!process.HasExited)
   {
       process.Kill();
   }
}

ここを参照してください:

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

于 2012-11-26T12:22:30.453 に答える