実現したいこと
ボタン0から10までの数字を画面に表示をさせたあと、11から20までの数字を表示させたい。
※0から10の数字を表示させる際、表示される順番は問いません。
※上記同様、11から20までの数字が表示される順番も問いません。
ソースコード
CSharp
1 private async void button1_Click(object sender, EventArgs e) 2 { 3 var task = CreateTask(0); 4 var task2 = CreateTask(11); 5 6 await Task.WhenAll(task); 7 Console.WriteLine($"0から10までを出力しました。"); 8 await Task.WhenAll(task2); 9 Console.WriteLine($"11から20までを出力しました。"); 10 } 11 12 13 private Task CreateTask(int v) 14 { 15 List<Task> tasks = new List<Task>(); 16 for (int i = v; i < v + 10; i++) 17 { 18 var task = PrintNum(i); 19 tasks.Add(task); 20 } 21 22 return Task.WhenAll(tasks); 23 } 24 25 private Task PrintNum(int num) 26 { 27 return Task.Run(() => Console.WriteLine($"{num}")); 28 }
実行結果
0
1
2
4
6
5
7
8
9
11
12
13
14
15
19
20
17
16
18
3
0から10までを出力しました。
11から20までを出力しました。
期待した結果
非同期実行ですから、以下のような出力を期待しておりました。
・0から10までの数字がランダムに出力される。
・0から10までを出力しました。と表示される。
・11から20までの数字がランダムに出力される。
・11から20までを出力しましたと表示される。
気になった点は2点です。
1.全ての非同期タスクが実行された後、末尾2行にメッセージが出力されたこと
2.末尾から3行目に『3』と表示されたこと。
本来であれば0から10までの数字が表示された後に11から20の数字が出力されるものだと考えておりました。
ひとつのタスク内で表示順がバラバラになるのは理解できるのですが、1つ目のawait Task.WhenAll(task)で全て出力された後に次のawait Task.WhenAll(task2)が実行されるものではないのでしょうか?
1つ目のタスクが完了後、次のタスクをまとめて実行するにはどのような非同期タスクの待ち方になるでしょうか??
環境
VisualStudio2017
C#
.NET Framework4.5.2
回答3件
あなたの回答
tips
プレビュー