ホームページ > バックエンド開発 > C++ > C# における Await と Result: Task.Result にアクセスする代わりに Await を使用する必要があるのはどのような場合ですか?

C# における Await と Result: Task.Result にアクセスする代わりに Await を使用する必要があるのはどのような場合ですか?

Mary-Kate Olsen
リリース: 2025-01-22 23:03:11
オリジナル
758 人が閲覧しました

Await vs. Result in C#: When Should You Use Await Instead of Accessing Task.Result?

C# 非同期プログラミングにおける Await と Result の比較

C# 非同期プログラミングでは、await キーワードはタスクが完了するまで実行を一時停止するために使用されます。ただし、タスクが完了しているのに、なぜ await が必要なのか、Task.Result 属性に直接アクセスできないのではないかと疑問に思う開発者もいます。この記事では、この問題を検討し、await を優先して使用する必要がある理由を説明します。

Stephen Cleary は、著書『Concurrency in C# Cookbook』で次のコード スニペットを推奨しています。

<code class="language-C#">var completedTask = await Task.WhenAny(downloadTask, timeoutTask);  
if (completedTask == timeoutTask)  
  return null;  
return await downloadTask;  </code>
ログイン後にコピー

ここで、downloadTask は HTTP GET リクエストを表し、timeoutTask はタイムアウト モニターとして機能します。 HTTP リクエストが指定された時間内に完了しない場合、timeoutTask は完了します。

HTTP リクエストがタイムアウトする前に完了すると仮定します。この場合、downloadTaskは完了です。では、なぜコード スニペットで 2 番目の await が使用されているのでしょうか? downloadTask.Result を使用しないのはなぜでしょうか?

答えは、例外処理の微妙な違いと潜在的なデッドロックにあります。 await は、ResultWait とは異なる方法で例外を処理します。 await例外を AggregateException でラップすることは避けてください。これは非同期コードでは一般に望ましくありません。さらに、ResultWait は、特に非同期メソッドでデッドロックを引き起こす可能性があります。

そのため、タスクが完了したことが明らかでない限り、await を優先することをお勧めします。一般に、非同期アプリケーション コードでは ResultWait の使用を避ける必要があります。これらは、非同期ユーティリティ ライブラリまたは並列タスク コードで使用される場合があります。

これらのガイドラインに従うことで、開発者は非同期コード ベースのセキュリティと保守性を向上させ、コードの可読性を向上させることができます。

以上がC# における Await と Result: Task.Result にアクセスする代わりに Await を使用する必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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