1

次のようなコードがあります。

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

プロセスを正常に終了させるという考えですが、5 秒以上かかる場合は、強制終了する必要があると思います。

これはほとんどの場合に機能するように見えますが、プロセスが Windows エラー メッセージをスローした場合は、単にハングします。以前は「process.Kill()」しかなく、それが機能していたので、タイムアウト値を指定しているにもかかわらず、実際には WaitForExit(5000) 呼び出しでスタックしていると想定する必要があります。

これが起こる理由は何ですか?

編集:そのエラーメッセージのために、実際にハングしているのは CloseMainWindow() ではないかと思います。その場合、CloseMainWindow() メソッドを試す前にプロセスの "responding" プロパティをチェックすると、実際には "false" が返されますか? もしそうなら、私はそれを確認してから、その場合は Kill を使用できます。

4

1 に答える 1

0

まず、わざわざそのようなことをしてくれた Marc に感謝したいと思います。そのような方法でエラーを再現できるとは思いもしませんでした。

いずれにせよ、CloseMainWindow() のヘルプ ファイルをより注意深く読んだ後、次のことがわかりました。

Return Value
Type: System.Boolean
true if the close message was successfully sent; false if the associated 
process does not have a main window or if the main window is disabled (for 
example if a modal dialog is being shown).

そのため、モーダル ダイアログ (私が見たエラーなど) がこれに問題を引き起こすと書かれています。なぜ失敗してタイムアウト後に強制終了されなかったのかはわかりませんが、この戻り値を使用して、このシナリオでプロセスを強制終了できると思います。

于 2016-04-14T20:15:51.357 に答える