非同期処理のシンプルサンプル
短いサンプルで確認してみましょう
すべてのタスクの完了を知ることもできる
コード
taskAとtaskBの両方が終了した時、このコードの次の行が実行されます
Task.WaitAll(taskA, taskB);
Task taskA = Task.Run(subA);
Task taskB = Task.Run(subB);
Task.WaitAll(taskA, taskB);
Console.WriteLine("終わり");
async Task subA()
{
Console.WriteLine("subA Start");
for (int i = 0; i < 5; i++)
{
Console.WriteLine("A" + i);
await Task.Delay(1000);
}
Console.WriteLine("subA End");
}
async Task subB()
{
Console.WriteLine("subB Start");
for (int i = 0; i < 5; i++)
{
Console.WriteLine("B" + i);
await Task.Delay(300);
}
Console.WriteLine("subB End");
}
実行結果
個別のタスクの完了を知ることもできる
コード
taskBが終了すると、int型の0を返します
Task.WaitAny(taskB)
taskAが終了すると「0」を、taskBが終了すると「1」を返します
Task.WaitAny(taskA, taskB)
戻り値を返すこともできます
タスクのBが終了した時点で、プログラムが終了します
その際、戻り値としての"TaskBが終わり"を表示しています
Task<string> taskA = Task.Run(subA);
Task<string> taskB = Task.Run(subB);
while (true)
{
if (Task.WaitAny(taskB) == 0)
{
Console.WriteLine(taskB.Result);
break;
}
}
async Task<string> subA()
{
Console.WriteLine("subA Start");
for (int i = 0; i < 5; i++)
{
Console.WriteLine("A" + i);
await Task.Delay(1000);
}
Console.WriteLine("subA End");
return "SubAが終わり";
}
async Task<string> subB()
{
Console.WriteLine("subB Start");
for (int i = 0; i < 5; i++)
{
Console.WriteLine("B" + i);
await Task.Delay(300);
}
Console.WriteLine("subB End");
return "TaskBが終わり";
}
ディスカッション
コメント一覧
まだ、コメントがありません