await Task<T>
と Task<T>.Result
の比較
await Task<T>
と 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>
ここで、Task<T>.Result
はタスクの結果を取得するために使用されます。 ただし、このアプローチでは、呼び出しスレッドがタスクの完了を同期的に待機する必要があるため、同時実行性に重大な影響を与える可能性があります。
非同期プログラミングは、await
演算子を使用してこれをエレガントに解決し、ノンブロッキングの一時停止を可能にします。 改良された非同期バージョンは次のとおりです:
<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
を使用すると、呼び出しスレッドが解放され、他のタスクを続行できるようになります。 待機中のタスクが完了すると、スレッドが再開され、結果がシームレスに返されます。
本質的に: await Task<T>
はスレッドを放棄することで真の非同期操作を容易にし、Task<T>.Result
はタスクが終了するまでスレッドをブロックします。 重要な違いは例外の処理方法です。Result
は例外を AggregateException
内でラップしますが、await
は元の例外を直接再スローします。
以上がAwait Task と Task.Result: 違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。