非同期プログラミングにおける Task<T>.Result
と await Task<T>
を理解する
非同期プログラミングでは、await Task<T>
と Task<T>.Result
のどちらを選択するかがパフォーマンスと例外処理に大きく影響します。 主な違いを見てみましょう。
GetName
メソッドは両方のアプローチを示しています。
Task<T>.Result
の使用:
<code class="language-csharp">public async Task<string> GetName(int id) { Task<string> nameTask = Task.Factory.StartNew(() => string.Format("Name matching id {0} = Developer", id)); return nameTask.Result; }</code>
nameTask.Result
は、タスクが完了するまで現在のスレッドをブロックします。これは長時間実行される操作では非効率的であり、アプリケーションのフリーズを引き起こす可能性があります。
await Task<T>
の使用:
<code class="language-csharp">public async Task<string> GetName(int id) { Task<string> nameTask = Task.Factory.StartNew(() => string.Format("Name matching id {0} = Developer", id)); return await nameTask; }</code>
await nameTask
は呼び出しスレッドを解放し、他のタスクが同時に実行できるようにします。 このメソッドは、nameTask
が終了した場合にのみ再開されます。
重要な相違点:
Task<T>.Result
ブロック。 await Task<T>
はそうではありません。await Task<T>
は例外を直接伝播します。 Task<T>.Result
はそれらを AggregateException
で包みます。ベストプラクティス:
Task.Factory.StartNew
を使用しないでください。効率を向上させ、.NET スレッド プールとの統合を改善するには、代わりに Task.Run
を使用してください。Task<T>.Result
と Task.Factory.StartNew
は動的タスクの並列処理に使用できますが、非同期プログラミング コンテキストでは一般に、応答性と保守性を向上させるために await
を使用することは推奨されません。 await
の使用は、非同期操作のより堅牢なアプローチとして推奨されます。以上が「Task.Result」と「await Task」: いつどちらを使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。