ホームページ >バックエンド開発 >C++ >C# で非同期 Void メソッドからの例外をキャッチするにはどうすればよいですか?

C# で非同期 Void メソッドからの例外をキャッチするにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-24 02:45:12949ブラウズ

How Can I Catch Exceptions from Async Void Methods in C#?

非同期 void メソッドでの例外の処理

Microsoft の .NET Async CTP では、例外をスローするときの非同期メソッドの動作が異なります。非同期 Task または非同期 Task メソッドでは、例外がキャッチされ、Task オブジェクトに付加されます。ただし、非同期 void メソッドの場合、例外を処理する Task オブジェクトはありません。

例外をキャッチ

非同期 void メソッドによってスローされた例外をキャッチするには、メソッド呼び出しを明示的に待つか、Wait() メソッドを使用する必要があります。

  1. メソッド呼び出しを待機しています:

    <code class="language-csharp"> public async Task Foo()
     {
         var x = await DoSomethingAsync();
     }
    
     public async void DoFoo()
     {
         try
         {
             await Foo();
         }
         catch (ProtocolException ex)
         {
             // 由于在异步方法中等待了调用,因此将捕获异常。
         }
     }</code>
  2. Wait() メソッドを使用します:

    <code class="language-csharp"> public void DoFoo()
     {
         try
         {
             Foo().Wait();
         }
         catch (ProtocolException ex)
         {
             // 由于等待了调用的完成,因此将捕获异常。
         }
     }</code>

エラー処理セマンティクス

Stephen Cleary 氏が指摘したように、非同期 void メソッドには異なるエラー処理セマンティクスがあります。

「非同期 void メソッドが例外をスローすると、その例外は非同期 void メソッドの開始時にアクティブだった SynchronizationContext で直接発生します。」

その他の指示

    .NET がメソッドを同期的に実行する場合、Wait() を使用するとアプリケーションがブロックされる可能性があります。
  • コンパイラーがこの動作をどのように処理するかについて詳しくは、以下の説明を参照してください:
  • https://www.php.cn/link/c4d856156b2c629314b9edd13523fe8e

以上がC# で非同期 Void メソッドからの例外をキャッチするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。