async/awaitで複数のTaskを同時に実行する

2020-03-25

Taskの配列を作成し、Task.WhenAllを呼ぶことで、
複数のTaskを同時に実行し、全てのTaskの処理が終了するまで待機する。

private async void button1_Click(object sender, EventArgs e)
{
    // Task配列の構築
    List<Task> arrayTask = new List<Task>();

    for (int intCount = 0; intCount < 5; intCount++)
    {
        Task objTask = Task.Run(async () =>
        {
            // 処理
            await Task.Delay(5000);
        });

        // Task配列にTaskを追加
        arrayTask.Add(objTask);
    }

    // Task配列の処理を実行し、全ての処理が終了するまで待機
    await Task.WhenAll(arrayTask);

    MessageBox.Show("完了");
}

Taskに戻り値がある場合は下記のようになる。

private async void button2_Click(object sender, EventArgs e)
{
    Random objRandom = new System.Random();

    // Task配列の構築
    List<Task<int>> arrayTask = new List<Task<int>>();

    for (int intCount = 0; intCount < 5; intCount++)
    {
        Task<int> objTask = Task<int>.Run(() =>
        {
            // 処理
            return objRandom.Next();
        });

        // Task配列にTaskを追加
        arrayTask.Add(objTask);
    }

    // Task配列の処理を実行し、全ての処理が終了するまで待機
    int[] arrayInt = await Task.WhenAll(arrayTask);

    string strResult = "";
    foreach(int intValue in arrayInt)
    {
        strResult += "\n" + intValue.ToString();
    }

    MessageBox.Show("完了" + strResult);
}

注意
Task objTask = Task.Run(async () => の部分を、
誤って Task objTask = new Task(async () => としてしまうと、
WhenAll で実行されないので注意が必要。