この質問にはすでに答えがあります。
以下のコードブロックに機能、性能、またはデッドロックの違いのリスクがありますか?
例1
await Task.WhenAll(task1, task2);
var result1 = await task1;
var result2 = await task2;
例2
await Task.WhenAll(task1, task2);
var result1 = task1.Result;
var result2 = task2.Result;
以下のコードブロックに機能、性能、またはデッドロックの違いのリスクがありますか?
いいえ、そのようなケースはありません。
どちらの場合も、タスクが作成されます。task1
そしてtask2
完成するでしょう。
したがって、あなたが書くとき:
var result1 = await task1;
var result2 = await task2;
コードは同期して実行されます。あなたはする必要はありませんawait
あなたのためにtask1
そしてtask2
完了しているでしょう。
2番目の例についても同じことが言えます。ここでは、結果を取得しようとします。
var result1 = task1.Result;
var result2 = task2.Result;
タスクはすでに完了しているので、threadを呼び出したり、コンテキストの切り替えなどを行ったりするスレッドをブロックしないでください。
更新
これら2つの方法の間に存在する唯一の機能上の違いは、エラー処理が異なることです。のawait
アンラップAggregateException
その間.Result
ただ例外を発生させます。
await
を展開しますAggregateException
どこで.Result
そのまま例外を発生させます。 - Scott Chamberlain