await
と Task.Result
の比較: ベスト プラクティス
「C# の同時実行性クックブック」では、完了したタスクを処理するパターンを示します。
<code class="language-csharp">var completedTask = await Task.WhenAny(downloadTask, timeoutTask); if (completedTask == timeoutTask) return null; return await downloadTask;</code>
このコードは、Task.WhenAny
を使用して、downloadTask
(httpclient.GetStringAsync
操作) より前に timeoutTask
(Task.Delay
呼び出し) が完了するかどうかを判断します。
単に await downloadTask
を返す代わりに downloadTask.Result
を使用するのはなぜですか? 理由は非常に重要です:
例外処理:
await
は、AggregateException
の複雑さを回避します。 Task.Result
または Task.Wait()
は例外を AggregateException
内にラップし、根本原因を曖昧にします。 非同期コードは理想的には例外を直接処理し、await
をよりクリーンなソリューションにします。デッドロックの回避:
Task.Result
または Task.Wait()
を使用すると、デッドロックが発生する可能性があります。 await
は非同期コンテキスト用に設計されており、このよくある落とし穴を防ぎます。ベストプラクティスの概要:
await
を優先します。Task.Result
または Task.Wait()
を使用できますが (理論的根拠を説明する明確なコメントが付いています)、一般的には避けるのが最善です。Task.Result
と Task.Wait()
は、同期ブロックが許容され理解されている並列タスクのシナリオで考慮できます。以上が完了したタスクに対して「Task.Result」の代わりに「await」を使用する必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。