C#で重たい処理を並列処理したいのですが,
全ての処理が終わるまで待機がよくわかりません.
以下のように書いてみたのですが,結果のfuga end
が,2end
の後ろに来てほしいです.
※Heavy("1")と("2")の中身はそれぞれ独立したものなので排他Lockなどは今のところ必要ありません.
初歩的なことかもしれませんがよろしくお願いします.
C#
1 2static void Main() { 3 fuga(); 4 Console.ReadLine(); 5 } 6 7 static async void fuga() { 8 Console.WriteLine("fuga start"); 9 Task.Run(() => Heavy("1")); 10 Task.Run(() => Heavy("2")); 11 Console.WriteLine("fuga end"); 12 } 13 14 15 static void Heavy(string str) { 16 Console.WriteLine(str + "Start"); 17 for (int i = 0; i < 1000000000; i++) ;//重たい処理 18 Console.WriteLine(str + "End"); 19 } 20
fuga start fuga end 1Start 2Start //ここで数秒待たされる 1End 2End
とりあえずこれで戻り値を拾えましたが会っているのでしょうか…
C#
1static void Main() { 2 3 fuga2(); 4 5 Console.ReadLine(); 6 } 7 8 9 static async void fuga2() { 10 Console.WriteLine("fuga start"); 11 var res = new int[2]; 12 13 14 var tasks = new List<Task<int>>(); 15 tasks.Add(Task.Run(() => Heavy("1"))); 16 tasks.Add(Task.Run(() => Heavy("2"))); 17 await Task.WhenAll(tasks.ToArray()); 18 19 tasks.ForEach(t => Console.WriteLine(t.Result)); 20 21 Console.WriteLine("fuga end"); 22 } 23 24 25 static async Task<int> Heavy(string str) { 26 Console.WriteLine(str + "Start"); 27 for (int i = 0; i < 1000000000; i++) ;//重たい処理 28 Console.WriteLine(str + "End"); 29 30 return 5; //ダミーデータ 31 } 32
fuga start 1Start 2Start //数秒待機 2End 1End 5 5 fuga end

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/04 06:48
2019/02/04 06:50
2019/02/04 06:53
2019/02/04 07:01
2019/02/04 07:03
2019/02/04 07:08 編集
2019/02/04 07:13 編集
2019/02/04 07:14
2019/02/04 07:20
2019/02/04 07:23
2019/02/04 07:24
2019/02/04 09:27
2019/02/04 09:59
2019/02/04 10:39 編集