ホームページ > バックエンド開発 > C++ > 完了したタスクに対して「Task.Result」の代わりに「await」を使用する必要があるのはどのような場合ですか?

完了したタスクに対して「Task.Result」の代わりに「await」を使用する必要があるのはどのような場合ですか?

Susan Sarandon
リリース: 2025-01-22 23:19:11
オリジナル
199 人が閲覧しました

When Should You Use `await` Instead of `Task.Result` for Completed Tasks?

完了したタスクの

awaitTask.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.ResultTask.Wait() は、同期ブロックが許容され理解されている並列タスクのシナリオで考慮できます。

以上が完了したタスクに対して「Task.Result」の代わりに「await」を使用する必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート