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
は、Result
や Wait
とは異なる方法で例外を処理します。 await
例外を AggregateException
でラップすることは避けてください。これは非同期コードでは一般に望ましくありません。さらに、Result
と Wait
は、特に非同期メソッドでデッドロックを引き起こす可能性があります。
そのため、タスクが完了したことが明らかでない限り、await
を優先することをお勧めします。一般に、非同期アプリケーション コードでは Result
と Wait
の使用を避ける必要があります。これらは、非同期ユーティリティ ライブラリまたは並列タスク コードで使用される場合があります。
これらのガイドラインに従うことで、開発者は非同期コード ベースのセキュリティと保守性を向上させ、コードの可読性を向上させることができます。
以上がC# における Await と Result: Task.Result にアクセスする代わりに Await を使用する必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。