どちらの回答も待ち受けていることについては触れていません Task.WhenAll
。
var task1 = DoWorkAsync();
var task2 = DoMoreWorkAsync();
await Task.WhenAll(task1, task2);
主な違いは Task.WaitAll
とは、Task.WhenAll
前者が(使用と同様のブロックであろうということですWait
後者は単一のタスクには)、全てのタスクが完了するまで、呼び出し元に制御用バックを得待つことができないであろう。
さらに、例外処理は異なります。
Task.WaitAll
:
少なくとも1つのタスクインスタンスがキャンセルされました。または、少なくとも1つのタスクインスタンスの実行中に例外がスローされました。タスクがキャンセルされた場合、AggregateExceptionのInnerExceptionsコレクションにOperationCanceledExceptionが含まれます。
Task.WhenAll
:
提供されたタスクのいずれかがフォルト状態で完了すると、返されたタスクもフォルト状態で完了します。その例外には、提供された各タスクからのラップされていない例外のセットの集約が例外に含まれます。
提供されたタスクのどれにも障害がなく、少なくとも1つがキャンセルされた場合、返されたタスクはキャンセルされた状態で終了します。
失敗したタスクもキャンセルされたタスクもない場合、結果のタスクはRanToCompletion状態で終了します。提供された配列/列挙型にタスクが含まれていない場合、返されたタスクは、呼び出し元に返される前に、すぐにRanToCompletion状態に遷移します。
await Task.WhenAll(task1, task2);
か?