次のコードでは、task1とtask2は互いに独立しており、並行して実行できます。次の2つの実装の違いは何ですか?
var task1 = GetList1Async();
var task2 = GetList2Async();
await Task.WhenAll(task1, task2);
var result1 = await task1;
var result2 = await task2;
そして
var task1 = GetList1Async();
var task2 = GetList2Async();
var result1 = await task1;
var result2 = await task2;
なぜ私はどちらを選ぶべきなのでしょうか?
編集:私はGetList1Async()とGetList2Async()メソッドの戻り値の型が異なることを追加したいと思います。
最初の例では、両方のタスクが完了するのを待ってから両方の結果を取得します。
2番目の例では、タスクが一度に完了するのを待ちます。
あなたのコードには、どちらか明確なものを使用してください。両方のタスクの結果タイプが同じ場合は、次の場所から結果を取得できます。WhenAll
など:
var results = await Task.WhenAll(task1, task2);
WhenAll
むやみに - Servy
最初の構文は読みやすくなっています。 結果を得る前に、すべてのタスクが完了するのを待つつもりであることを明確に述べます。私はその代わりにそれを使用するのに十分合理的だと思います。
3番目または4番目のタスクを追加した場合も、書き込みが少なくなります。 すなわち:
await Task.WhenAll(task1, task2, task3, task4);
に比べ:
var result1 = await task1;
var result2 = await task2;
var result3 = await task3;
var result4 = await task4;
WhenAll
代わりに。 - Servy
var result = await task1;
まったく同じになりますvar result = task1.Result
。私はそう思います.Result
もっと読みやすいです。 - dcastroAggregateException
使用時よりawait
(最初の例外)async/await
あなたが使うのを好むべきですawait
オーバー.Result
例外動作の一貫性を保つため - Matt Smith