メッセージの処理にキューにAutoResetEvent(WaitOne/Set)を使用するアプリケーションがあります。私は、Visual Studio(Shift + F5)からデバッグセッションを終了すると、アプリケーションの元のプロセスがハングアップすることに気付いています(常にそうとは限りません)。私は手動でデバッガをプロセスに再接続し、WaitHandle.WaitOneに1つのスレッドが残っていることを確認します。スレッドは、WaitOne状態のAutoResetEvent信号によってアプリケーション終了後も保持されます。
私の質問は、WaitOne状態のスレッドを終了させる正しい方法は何ですか?
最初の答えはApplication Exitイベントを聞いてそこでSetを実行することでしたが、このイベントがこれらのデバッグセッションの後に確実に呼び出されたかどうか、またはより標準的なプラクティスがあるかどうかはわかりませんでした私は気づいていない。
もう1つの質問として、「生産」モードで実行されているアプリケーションでこれを別に処理しますか?
ええ、あなたの手には厄介な問題があります。デバッグセッションを終了するには、Windowsで利用可能な最大のものであるTerminateProcess()を使用します。 Taskmgr.exeで使用されているのと同じ種類の銃。プロセスが終了しない、カーネルスレッドがビジー状態で、I/O要求を完了していない可能性のある方法は1つだけです。それは、確かにAutoResetEventではありません。意味がありません。 –
@Hans - デバッガを接続するとWaitHandleがコールスタックに表示されますが、信号の待機ハンドルではなく、カーネルI/Oタスクの別の待機ハンドルですか?この仕事の唯一のI/Oはいくつかのロギングであり、それは実際には非常に簡単です(そして、何度も何度も何度も手動でトリガーされます)。 – Matt
私が知っている限り、センス。どんなドキュメンテーションもなければ、私は容易に説明が間違っていると思います。アンマネージデバッグとMicrosoftシンボルサーバーを有効にしてスタックトレースを送信します。 –