[解決済み】複数の非同期タスクを実行し、すべてのタスクが完了するのを待つ
質問
コンソールアプリケーションで複数の非同期タスクを実行し、それらがすべて完了するのを待ってから次の処理を行う必要があります。
いろいろな記事がありますが、読めば読むほど分からなくなるようです。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状態に移行します。
関連
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】C#で四捨五入する方法
-
[解決済み] タスクの並列実行
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] 複数のタスクにasync/awaitを使用する
-
[解決済み] C#でawaitを使わずに非同期メソッドを安全に呼び出す方法
-
[解決済み] Task.Runをメソッドに入れないと非同期にはならないのですか?
-
[解決済み】非同期処理の待ち時間、Wait()でプログラムがフリーズする原因はここにある
-
[解決済み] .NET 4.5で2つの非同期タスクを並列に実行し、結果を収集する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み】複数のタスクを待機させ、異なる結果を得ることができる。