6

この質問にはすでに答えがあります。

以下のコードブロックに機能、性能、またはデッドロックの違いのリスクがありますか?

例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; 


  • 見るstackoverflow.com/questions/24623120/… - Jaco
  • 結果はデッドロックを引き起こす可能性があります。この答えをチェックしてください。stackoverflow.com/questions/24623120/… - Cody
  • @Cody - この場合、タスクがすでに完了しているため、デッドロックすることは不可能だと思います。 - NStuke
  • @JacodeGroot - Stephen明らかにその質問に対する答えはかなり詳細です、リンクをありがとう。この場合、Task.WhenAll()は既にAggregateExceptionのラップを解除しているので、心配する必要はありません。 - NStuke

1 답변


6

以下のコードブロックに機能、性能、またはデッドロックの違いのリスクがありますか?

いいえ、そのようなケースはありません。

どちらの場合も、タスクが作成されます。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
  • @ScottChamberlainご意見ありがとうございます。私はそれを私の答えに含めます。 - Christos

リンクされた質問


関連する質問

最近の質問