私のメソッドはTask
を返します。私はそれが終わるまで待っています。何を使用すればよいですか .Wait()
または.GetAwaiter().GetResult()
?それらの違いは何ですか?.Wait()と.GetAwaiter()。GetResult()の違いは何ですか?
30
A
答えて
33
両方とも、操作結果の同期待機です(可能な場合は、これらを避ける必要があります)。
違いは主に例外処理です。 Wait
では、例外スタックトレースは不変であると例外が発生したときの実際のスタックを表し、そうあなたは、スレッドプールのスレッド上で実行されるコードの部分を持っている場合、あなたは
ThreadPoolThread.RunTask
YourCode.SomeWork
のようなスタックを持っていると思います
一方、.GetAwaiter().GetResult()
は、コードの一部がUIスレッド上で実行され、一部がThreadPoolスレッド上で実行されることを無視して、すべての非同期コンテキストを考慮に入れてスタックトレースを再作成します。また、単に非同期I/O 。だからあなたのスタックトレースはあなたのコードて、同期のようなステップを反映します:
TheSyncMethodThatWaitsForTheAsyncMethod
YourCode.SomeAsyncMethod
SomeAsync
YourCode.SomeWork
これは例外スタックを作る傾向がある、控えめに言っても、多くの便利なトレース。 「実行された物理的な方法」ではなく、アプリケーションのコンテキストで、YourCode.SomeWork
がと呼ばれた場所を確認できます。
これがどのように機能するかの例は、reference source(非契約型です)にあります。
関連する問題
- 1. Async await vs GetAwaiter()。GetResult()とコールバック
- 2. wait-notifyとCountDownLatchの違い
- 3. TIME-WAIT暗殺とSO_REUSEADDRの違い
- 4. Doctrine 2:行がないときにgetResultが返すのは何ですか?ヌル?
- 5. wait(long timeout)とjoin(long millis)の違いは?
- 6. difftimeと ' - 'の違いは何ですか?
- 7. A`と ``の違いは何ですか[:] `
- 8. `&`と `ref`の違いは何ですか?
- 9. バックスティックと$()の違いは何ですか?
- 10. `##`と `hashCode`の違いは何ですか?
- 11. "$^N"と "$ +"の違いは何ですか?
- 12. #{} $ {}と%{}の違いは何ですか?
- 13. typedefとの違いは何ですか?
- 14. %Qと%{}の違いは何ですか?
- 15. `==`と `is`の違いは何ですか?
- 16. $と$$の違いは何ですか?
- 17. NodeJS:「./ ..」と「..」の違いは何ですか?
- 18. $ dirtyと$ invalid:違いは何ですか?
- 19. Backbone.jsとPusherapp - 違いは何ですか?
- 20. libspeとlibspe2?違いは何ですか?
- 21. リストと何か([_])と何か(_)の違い
- 22. decodeURIComponentとunescapeの違いは何ですか?unescapeの問題は何ですか?
- 23. コロンの配置の違いは何ですか:何かと何か:
- 24. GoogleのDremelとは何ですか? Mapreduceとの違いは?
- 25. 重要な違いは何ですかext2-ext3とext3-ext4の違いは何ですか?
- 26. 「アソシエーション」と「リレーション」という用語の違いは何ですか?
- 27. グロムとは何ですか? mapPartitionsとの違いは?
- 28. AndroidでThread.run()とHandler.post()とServiceの違いは何ですか?
- 29. Androidでは、MotionEventのgetAction()とgetActionMasked()の違いは何ですか?
- 30. XSLT属性の違いとは何か
[Task.GetAwaiter()](https://msdn.microsoft.com/en-us/library/system.threading.tasks.task.getawaiter%28v=vs.110%29.aspx)は[ TaskAwaiter](https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.taskawaiter%28v=vs.110%29.aspx)を参照してください。ただし、[TaskAwaiter.GetResult()](https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.taskawaiter.getresult%28v=vs.110%29.aspx)のドキュメントには、 :* "このAPIは製品インフラストラクチャをサポートしており、コードから直接使用するためのものではありません。" *コメントできますか? – DavidRR
@DavidRR 'TaskAwaiter'は実装の詳細です。一方、待ち受け/待ち受けのメカニズムは文書化され、ダックタイピングを使用します。GetAniteratorはGetEnumeratorがforeachになるか、Disposeが「使用する」ために待機します。これはすべて、C#の仕様で定義されています。使用する特定の待ち時間に関係なく、「Task.GetAwaiter」は「アプリケーションコードで使用するのではなく、コンパイラでの使用を意図しています」ということに注意してください。しかし要点は、Wait()やGetAwaiter()。GetResult()ではなく、 'await'を使うことです。必要な場合には' GetResult'でより良いスタックを得ることができます。 – Luaan