.Wait() と .GetAwaiter().GetResult() の違いは何ですか? 質問する

.Wait() と .GetAwaiter().GetResult() の違いは何ですか? 質問する

私のメソッドは を返しますTask。それが完了するまで待機したいと思います。 と のどちらを使用すればよいです.Wait().GetAwaiter().GetResult()? これらの違いは何ですか?

ベストアンサー1

どちらも、操作の結果を同期的に待機します (可能な場合はこれらを避ける必要があります)。

違いは主に例外処理にあります。 ではWait、例外スタックトレースは変更されず、例外発生時の実際のスタックを表します。そのため、スレッドプールのスレッドで実行されるコードがある場合、次のようなスタックになります。

ThreadPoolThread.RunTask
YourCode.SomeWork

一方、.GetAwaiter().GetResult()スタックトレースをすべての非同期コンテキストを考慮して再加工し、コードの一部がUIスレッドで実行され、一部がThreadPoolスレッドで実行され、一部が単に非同期I/Oであることを無視します。そのため、スタックトレースは同期のようなステップを反映します。あなたのコード:

TheSyncMethodThatWaitsForTheAsyncMethod
YourCode.SomeAsyncMethod
SomeAsync
YourCode.SomeWork

これにより、例外スタックトレースが、控えめに言っても、はるかに便利になります。どこでYourCode.SomeWork呼び出されたかを確認できます。あなたのアプリケーションの文脈において「物理的に実行された方法」ではなく、「実行された方法」です。

これがどのように機能するかの例は、参照元(もちろん契約上のものではありません)。

おすすめ記事