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

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

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

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

Q&A

解決済

1回答

3779閲覧

C# Task.WaitAll()メソッドの使い方が知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

0クリップ

投稿2022/05/23 10:44

編集2022/05/25 02:46

提示コードのTask.WaitAll()の部分ですが10個のタスクが終わったらまた10個貯めて終わったらまた10個といった具合にタスクの終了待ちをしているのですがこの関数に達してから処理が動かず次のtotal += 10という変数に加算されません。またその次のええええのコンソールログも出力されません。これはどうなっているんでしょうか?提示コード//非同期メソッドを実行

また下記のawait.csはawait していまっているので無限にタスクが走ってしまいます。

環境

.Net framework 6.0
windows form
C#言語
OS: Windows10
IDE: Visual studio 2022

参考サイト:https://www.delftstack.com/ja/howto/csharp/wait-for-thread-to-finish-in-csharp/

出力
1 えええええ 2 えええええ 3 えええええ 4 Title えええええ Title 5 えええええ Title Title 6 えええええ Title 7 えええええ 8 えええええ Title 9 えええええ 10 えええええ 11 qqqqqqqqq Title スレッド 0x1bd8 はコード 0 (0x0) で終了しました。 Title title [720p] Kosmos, Cosmos - Yukiho, Chihaya, Hibiki (Idolmaster 2 S4U mode) Title Title Title Format title The iDOLM@STER 2: Little Match Girl (Yukiho, Makoto, Haruka) title [720p] The Idolm@ster 2nd-Mix - Quintet (from THE iDOLM@STER 2 S4U mode) title THE iDOLM@STER 2 - 『Do-Dai』 (響 やよい 雪歩) [HD] Format Format スレッド 0x48e4 はコード 0 (0x0) で終了しました。 title The iDOLM@STER 2: kiramekirari (Yayoi, Mami, Hibiki) Format title The iDOLM@STER 2: I Want (Makoto, Ritsuko, Azusa) title The iDOLM@STER 2: Ai Like Hamburger (Haruka, Miki, Yayoi) ERROR ERROR: [youtube] ZSvnFswX0hU: Video unavailable. This video contains content from Nippon Columbia Co., Ltd., who has blocked it on copyright grounds Format 終了 ああああ "https://www.youtube.com/watch?v=ZSvnFswX0hU" title The iDOLM@STER: Meisou Mind (Makoto, Yukiho, Miki) Format 'Downloader.exe' (CoreCLR: clrhost): 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\6.0.5\System.Text.RegularExpressions.dll' が読み込まれました。シンボルの読み込みをスキップしました。モジュールは最適化されていて、デバッグ オプションの [マイ コードのみ] 設定が有効になっています。 title The iDOLM@STER 2: Honey Heartbeat (Hibiki, Chihaya, Takane) 終了 Format Format 終了 終了 終了 Format 終了 Format title The iDOLM@STER 2: MEGARE! (Makoto, Ritsuko, Hibiki) Format 終了 終了 終了 終了 終了 スレッド 0x43d0 はコード 0 (0x0) で終了しました。 スレッド 0x3b8c はコード 0 (0x0) で終了しました。 スレッド 0x3668 はコード 0 (0x0) で終了しました。 スレッド 0x4a50 はコード 0 (0x0) で終了しました。 スレッド 0x2c4c はコード 0 (0x0) で終了しました。 スレッド 0x40d4 はコード 0 (0x0) で終了しました。 プログラム '[16568] Downloader.exe' はコード 4294967295 (0xffffffff) で終了しました。
form1.cs

cs

1 2 /* ########################### リストに設定 非同期 ###########################*/ 3 public async void setDataList_Async(string u) 4 { 5 Func<Data?> job = () => 6 { 7 Data d = new Data(); 8 d.setData(u); //フォーマットを設定 9 10 if (d.getFormat() != null) 11 { 12 data.Add(d); 13 if (this.InvokeRequired) 14 { 15 this.Invoke(new Action(() => 16 { 17 Debug.WriteLine("あああああ"); 18 checkedListBox_list.Items.Add(d.getTitle()); 19 })); 20 } 21 22 return d; 23 } 24 else 25 { 26 Debug.WriteLine("ああああ " + u); 27 //MessageBox.Show("URL ERROR: " + u,"", MessageBoxButtons.OK, MessageBoxIcon.Error); 28 return null; 29 } 30 }; 31 32 33 taskData.Add(Task.Run(job)); //非同期メソッドを実行 34 Debug.WriteLine(taskData.Count); 35 if (taskData.Count > total) 36 { 37 Debug.WriteLine("qqqqqqqqq"); 38 39 Task.WaitAll(taskData.ToArray()); 40 Debug.WriteLine("qwwwww"); 41 total += 10; 42 } 43 44 Debug.WriteLine("えええええ"); 45 /* 46 //成功時 リストに代入 47 if (b != null) 48 { 49 Debug.WriteLine(b.getTitle()); 50 checkedListBox_list.Items.Add(b.getTitle()); 51 } 52 else 53 { 54 Debug.WriteLine("null"); 55 } 56 */ 57 } 58
await.cs

cs

1 2 /* ########################### リストに設定 非同期 ###########################*/ 3 public async void setDataList_Async(string u) 4 { 5 Func<Data?> job = () => 6 { 7 Data d = new Data(); 8 d.setData(u); //フォーマットを設定 9 10 if (d.getFormat() != null) 11 { 12 data.Add(d); 13 14 this.Invoke(new Action(() => 15 { 16 Debug.WriteLine("あああああ"); 17 checkedListBox_list.Items.Add(d.getTitle()); 18 })); 19 20 21 return d; 22 } 23 else 24 { 25 Debug.WriteLine("ああああ " + u); 26 //MessageBox.Show("URL ERROR: " + u,"", MessageBoxButtons.OK, MessageBoxIcon.Error); 27 return null; 28 } 29 }; 30 31 32 await Task.Run(job); //非同期メソッドを実行 33 34 35 Debug.WriteLine("えええええ"); 36 /* 37 //成功時 リストに代入 38 if (b != null) 39 { 40 Debug.WriteLine(b.getTitle()); 41 checkedListBox_list.Items.Add(b.getTitle()); 42 } 43 else 44 { 45 Debug.WriteLine("null"); 46 } 47 */ 48 }

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

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

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

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

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

Zuishin

2022/05/23 11:01

前回の質問と同じ。 意味不明なベストアンサーで閉じるんだったら聞かないでください。
Zuishin

2022/05/23 11:02 編集

それとも二人で組んで誰の役にも立たない質問と回答を量産する嫌がらせでもしてるのかな?
退会済みユーザー

退会済みユーザー

2022/05/24 22:40

質問者さん、無言ですが、回答したのでそれに対するフィードバックをタイムリーに返してください。役に立った/立たなかったぐらいはすぐに返せるのでは? 役に立たなかったならどこがダメかを書くとより期待に近い回答が出てくるかも。とにかく無言は NG です。
退会済みユーザー

退会済みユーザー

2022/05/25 00:23

すいませんちょっと忙しかったので確認できませんでした
退会済みユーザー

退会済みユーザー

2022/05/25 02:10 編集

回答が付いた後は質問を書き換えないでください。回答とのつじつまが合わなくなりますので。元に戻して、何か書きたいなら、追記という形で書いてください。
退会済みユーザー

退会済みユーザー

2022/05/25 02:21

すいませんでした。
退会済みユーザー

退会済みユーザー

2022/05/25 02:35 編集

謝る必要はないので、回答が付く前の内容に戻してください。何か書きたいなら、追記という形で書いてください。 元の質問は「C# Task.WaitAll()メソッドの使い方が知りたい」でした。
guest

回答1

0

ベストアンサー

C# Task.WaitAll()メソッドの使い方が知りたい。

Windows Forms アプリですよね。であれば、Task.WaitAll メソッドを使うのがそもそもの間違いだと思います。デッドロックの原因になるので async / await と混ぜて使ってはいけないものです (参考にした記事はコンソールアプリなのでデッドロックになることはないですが)。

Task.WhenAll メソッドを使って await で待機するようにあなたのコードを書き直してはいかがですか。具体例は以下の記事を見てください。

タスク並列ライブラリ (TPL)
http://surferonwww.info/BlogEngine/post/2020/12/27/task-parallel-library.aspx

上の記事の最初のコードブロックの下の方の WhenAll1_Click, WhenAll2_Click メソッドのコードがその例です。ちなみに、コードのコメントにも書いてありますが、WaitAll ではデッドロックになります。

または、記事の下の方の 【2021/6/13 追記】に書いた async / await を使って TPL の部分を await Task.Run で動かすという方法も使えるかもしれません。

検討してみてください。

投稿2022/05/24 01:27

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2022/05/25 00:55

回答読んでますか? 「Task.WhenAll メソッドを使って await で待機する」というのが回答です。TPL 案も書いてますが、そっちの方向に進みたいということ?
退会済みユーザー

退会済みユーザー

2022/05/25 01:44 編集

失礼しました。以下のように処理を組みましたがこれは正解なのでしょうか? ``` if(taskData.Count > total) { Task<Data?[]> t = Task.WhenAll(taskData); //非同期メソッドを実行 t.Wait(); taskData.Add(Task.Run(job)); total += 10; Debug.WriteLine(taskData.Count); } else { taskData.Add(Task.Run(job)); } ```
退会済みユーザー

退会済みユーザー

2022/05/25 02:13

違います。話が通じてないようです。回答を注意深く読んでない、もしくは読んでも理解できないのどっちですか? もう一度書きますが「Task.WhenAll メソッドを使って await で待機する」というのが回答です。
退会済みユーザー

退会済みユーザー

2022/05/25 02:30

すいませんでした。以下のようにしたのですがこれは正解なのでしょうか? デバッグログで確認したところ三つ実行してから三つ実行していますが処理の作り方としてはどうなのでしょうか? ``` foreach (string item in list) { if (taskData.Count > total) { await Task.WhenAll(taskData); total += 3; } setDataList_Async(item); } ```
退会済みユーザー

退会済みユーザー

2022/05/25 02:49

また以下ようにしたのですが処理が止まりません。 ``` if (taskData.Count < total) { taskData.Add(Task.Run(job)); // Debug.WriteLine("ああああああああああ!!!"); } else { await Task.WhenAll(taskData); taskData.Add(Task.Run(job)); Debug.WriteLine("ああああああああああ!!!"); total += 3; //taskData.Add(Task.Run(job)); } ```
退会済みユーザー

退会済みユーザー

2022/05/25 03:04

意味不明なコードを見せられてそれが正解かどうか聞かれても答えられません。 元の質問は「C# Task.WaitAll()メソッドの使い方が知りたい」でした。それに対しては回答済みです。 それをあなたのコードに適用してあなたの期待通りになるかどうかはあなたにしか分かりません。実際に動かして試す環境はあなたしか持ってないし、あなたの期待することも詳しくは他人には分からないのだから。
退会済みユーザー

退会済みユーザー

2022/05/25 03:26 編集

前にもあなたのスレッドで書きましたが、あなたが質問に書いた長い、しかも問題と関係なさそうなものまで多々入っているコードを読む気力は私にはないのです。 今のコードを、問題が再現できる必要最小限のところまで、どんどん削っていくということをやってみましょう。そうする過程で原因が分かって、自己解決できるというのはよくあることです。 自己解決できなくても必要最低限かつそれをコピペすれば動くコードを提示してもらえれば私以外にも見てくれる人がいて、有用な情報がもらえるかもしれません。ただしそうする場合はこのスレッドはクローズして、新たに別のスレッドを立てて質問願います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問