1. ホーム
  2. c#

[解決済み】複数の非同期タスクを実行し、すべてのタスクが完了するのを待つ

2022-04-28 05:43:14

質問

コンソールアプリケーションで複数の非同期タスクを実行し、それらがすべて完了するのを待ってから次の処理を行う必要があります。

いろいろな記事がありますが、読めば読むほど分からなくなるようです。Taskライブラリの基本原理は読んで理解しているのですが、明らかにどこかのリンクが抜けているようです。

しかし、私はすべてのタスクを同時に実行したいし、すべてのタスクが完了したことを確認したいのです。

このようなシナリオの場合、最もシンプルな実装は何でしょうか?

どのように解決するのですか?

どちらの回答も、awaitableについて触れていません。 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 :

与えられたタスクのいずれかが Faulted 状態で完了すると、 返されるタスクも Faulted 状態で完了し、その例外には与えられた各タスクからラップされていない例外のセットが集約されます。

提供されたタスクのいずれにも障害が発生せず、少なくとも1つのタスクがキャンセルされた場合、返されたタスクはキャンセルされた状態で終了します。

どのタスクも失敗せず、どのタスクもキャンセルされなかった場合、結果のタスクは RanToCompletion 状態で終了します。 提供された配列/enumerableにタスクが含まれていない場合、返されたタスクは呼び出し元に返される前に直ちにRanToCompletion状態に移行します。