C# の非同期 void メソッドの例外処理
.NET の非同期 CTP を使用する場合、特に非同期 void メソッドを扱う場合、非同期メソッドの内部と外部で例外がどのように処理されるかを理解することが重要です。
非同期メソッドでの例外の伝播
提供された C# コードでは、Foo() という名前の非同期 void メソッドが非同期に実行され、非同期メソッド DoFoo() によって呼び出されます。 Foo() では、例外 (ProtocolException など) がスローされた場合、それは自動的に DoFoo() に伝播されません。これは、非同期 void メソッドが待機可能な Task オブジェクトを返さないためです。
呼び出しメソッドで例外を処理します
呼び出し側メソッドの非同期 void メソッドからスローされた例外をキャッチするには、以下を行う必要があります:
非同期メソッドでの呼び出しを待機します:
DoFoo() メソッドを変更して非同期にし、await Foo() を使用します。これにより、Foo() が完了するまで待機し、スローされる可能性のある例外をキャッチします。
完了を待機している同期:
DoFoo() で Foo() の結果の Wait() メソッドを使用します。これにより、非同期操作が完了するまでスレッドがブロックされ、発生した例外がスローされます。
await の使用例:
<code class="language-csharp">public async void DoFoo() { try { await Foo(); // 因为您已 await,所以会捕获异常 } catch (ProtocolException ex) { // 处理异常 } }</code>
Wait を使用した例:
<code class="language-csharp">public void DoFoo() { try { Foo().Wait(); // 因为您已等待,所以会捕获异常 } catch (ProtocolException ex) { // 处理异常 } }</code>
Wait を使用すると、操作が完了するまでスレッドがブロックされるため、同期の問題が発生する可能性があることに注意してください。 スレッドのブロックを回避し、プログラムの応答性を向上させるために、最初に await
メソッドを使用することをお勧めします。
以上がC# の Async Void メソッドによってスローされた例外を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。