マルチスレッドアプリケーションは初めてです。作業を始める前に、私はほとんど疑問を持っていません。誰かがこれらの疑問を解決できますか?
- マルチスレッドアプリケーションで例外を処理する方法は?
- 1つのスレッドに例外がある場合、アプリケーション全体がダウンしますか?または他のすべてのスレッドは続行されますか?
マルチスレッドアプリケーションは初めてです。作業を始める前に、私はほとんど疑問を持っていません。誰かがこれらの疑問を解決できますか?
マルチスレッドアプリケーションで例外を処理する方法は?
最良の方法はスレッドの内側ですが、場合によってはたとえば。(スレッドプール)これは難しいです。未処理の例外を処理する方法は、アプリケーションの種類によって異なります。
Application.DispatcherUnhandledException
AppDomain.UnhandledException
ASP.NET、WinForms、...には独自のメカニズムがあります。
ただし、次の点を考慮してください。特に、デフォルトの処理を可能にし、デバッガーに分類されるように開発している場合(追加if (Debugger.IsAttached) { Debugger.Break(); }
は、永続的なブレークポイントを定義するのに非常に役立ちます)
1つのスレッドに例外がある場合、アプリケーション全体がダウンしますか?
場合によります。ASP.NETの場合:いいえ(デバッグが有効になっている場合は、黄色の画面が表示されます。有効になっていない場合は、500サーバーエラーが発生します)。他のホストの場合:依存します(ただし、一般的に答えは「はい」です。プロセスは終了します)。
この詳細の一部は.NETバージョン間で変更されており、通常はより厳密になっているため、調査を行う必要があります。最後に、.NET 4では確かに、おそらく以前にも、特定の例外(たとえばStackOverflowException
)がスローされた場合に一貫したプロセス状態を維持する信頼できる方法がないため、それらをキャッチできません。
TPLを使用している場合は、集約例外を使用できます。この集約例外は、例外のコレクションであり、それらをループして、実行に失敗したスレッドを確認できます。詳細については、こちらを参照してください。 http://msdn.microsoft.com/en-us/library/dd997415.aspx