await
と Task.Result
: 比較分析
Stephen Cleary の「Concurrency in C# Cookbook」では、ノンブロッキングのタスク完了検出方法を示しています。
<code class="language-csharp">var completedTask = await Task.WhenAny(downloadTask, timeoutTask); if (completedTask == timeoutTask) return null; return await downloadTask;</code>
ここで疑問が生じます: await
がすでに完了している場合、2 番目の downloadTask
は必要ですか?単純に downloadTask.Result
を使用しないのはなぜですか?
主な違いは、例外処理とデッドロック回避にあります。
例外処理: 重要な違い
Task.Result
は例外を AggregateException
内にラップするため、特定の処理が必要です。 ただし、await
は例外を直接伝播するため、非同期コードの自然な流れとよりよく調和し、AggregateException
管理の複雑さを回避します。
デッドロックの防止: セーフティ ネット
Task.Result
と Task.Wait
は、特に非同期メソッド内でデッドロックを引き起こす可能性があります。 現実世界のシナリオではタスクの完了を明確に判断するのは困難な場合が多いため、await
はより安全な代替手段を提供します。
タスク処理のベスト プラクティス
堅牢でデッドロックのない非同期プログラミングを保証するには、次のガイドラインに従ってください。
await
のみを優先します。Task.Result
または Task.Wait
は、特定のユーティリティ関数では許容される場合がありますが、常に潜在的なリスクを概説する明確なドキュメントが必要です。Task.Result
および Task.Wait
は、慎重に制御された並列シナリオではより適切である可能性があります。ほとんどの状況では、await
が完了したタスクを処理し、信頼性が高くデッドロックのない非同期操作を保証するための推奨アプローチです。
以上が完了したタスクの `await` は `Task.Result` を使用するのと同じですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。