非同期処理のシンプルサンプル

短いサンプルで確認してみましょう

すべてのタスクの完了を知ることもできる

コード

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が終わり";
}

実行結果

C#,非同期

Posted by hidepon