質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

5863閲覧

Task.WhenAll が終了を待たない

ohno1011

総合スコア14

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2021/07/09 08:30

お世話になります。

現在、Taskを使って非同期処理の実装をしようとしていますが、Task.WhenAllがタスクの終了を待ってくれません。

C#

1Private void hoge() 2{ 3 Console.WriteLine("開始"); 4 5 Task task = Task.Run(() => 6 { 7 Console.WriteLine("タスク開始"); 8 System.Threading.Thread.Sleep(3000); 9 Console.WriteLine("タスク終了"); 10 }); 11 12 Task.WhenAll(task); 13 Console.WriteLine("終了"); 14}

上記のように記述したコードを通すと、
出力結果が

開始
終了
タスク開始
タスク終了 (3秒後)

となります。

WhenAllの前にタスク内の処理が走らないのはなぜかわかりますでしょうか。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

こんにちは。

Task.WhenAll が返す値は Task です。
これを待たずに "終了" を出力しているので当然そうなります。
どうなるのが理想なのかがわからないのでなんとも言えないですが、
少なくとも WhenAll の結果を await すれば、"終了" の出力は WhenAll の完了後にスケジュールされます。

投稿2021/07/09 08:43

tamoto

総合スコア4252

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ohno1011

2021/07/09 08:49

WhenAllをさらに待つ必要があるのですね。 ありがとうございました。
guest

0

Task.WhenAll メソッド
リファレンスにはこうあります。

指定されたすべてのタスクが完了してから完了するタスクを作成します。

投稿2021/07/09 08:42

YAmaGNZ

総合スコア10489

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ohno1011

2021/07/09 08:50

理解できました。 ありがとうございました。
guest

0

ベストアンサー

Task.WhenAll メソッド

指定されたすべてのタスクが完了してから完了するタスクを作成します。

WhenAllはタスクを作成するだけなので、全てのタスクが終わったのを待ちたいのであれば、WhenAllで作成したタスクを更に待機するか、WaitAll を使うべきではないでしょうか。

投稿2021/07/09 08:42

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ohno1011

2021/07/09 08:51

WhenAllがタスクを返すということを理解できていませんでした。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問