コンソール アプリケーションで複数の非同期タスクを実行し、すべてが完了するまで待ってからさらに処理を進める必要があります。
たくさんの記事がありますが、読めば読むほど混乱するようです。タスク ライブラリの基本原則を読んで理解しましたが、明らかにどこかにリンクが欠けています。
タスクを連鎖させて、別のタスクが完了した後に開始することは可能であることは理解していますが (これは私が読んだすべての記事のシナリオとほぼ同じです)、すべてのタスクを同時に実行し、すべてが完了したらそれを知りたいのです。
このようなシナリオの最も簡単な実装は何でしょうか?
ベストアンサー1
どちらの回答も、待ち望んでいたことについては触れていないTask.WhenAll
:
var task1 = DoWorkAsync();
var task2 = DoMoreWorkAsync();
await Task.WhenAll(task1, task2);
主な違いはTask.WaitAll
Task.WhenAll
前者はブロックしますが (単一のタスクで使用する場合と同様) Wait
、後者はブロックされず、待機することができ、すべてのタスクが完了するまで呼び出し元に制御が返されます。
さらに、例外処理も異なります。
Task.WaitAll
:
少なくとも 1 つの Task インスタンスがキャンセルされたか、少なくとも 1 つの Task インスタンスの実行中に例外がスローされました。タスクがキャンセルされた場合、AggregateException の InnerExceptions コレクションに OperationCanceledException が含まれます。
Task.WhenAll
:
指定されたタスクのいずれかが障害状態で完了した場合、返されるタスクも障害状態で完了し、その例外には指定された各タスクからのラップされていない例外のセットの集約が含まれます。
提供されたタスクのいずれも失敗しなかったが、少なくとも 1 つのタスクがキャンセルされた場合、返されたタスクはキャンセルされた状態で終了します。
いずれのタスクも失敗せず、いずれのタスクもキャンセルされなかった場合、結果のタスクは RanToCompletion 状態で終了します。指定された配列/列挙型にタスクが含まれていない場合、返されたタスクは呼び出し元に返される前に、すぐに RanToCompletion 状態に遷移します。