Taskクラスで、複数のタスクを起動し、タスクの処理が終了するまで、非同期的に待つ方法を記載します。

非同期的に待つ方法には Async と AWait を使用します。

Task.WhenAllメソッドを使用して、全てのタスクが終了するまで待つ

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    DirectCast(sender, Button).Enabled = False

    Dim task1 As Task = task.Run(
        Sub()
            System.Threading.Thread.Sleep(10000)    '重たい処理
        End Sub
    )

    Dim task2 As Task = Task.Run(
        Sub()
            System.Threading.Thread.Sleep(5000)     '重たい処理
        End Sub
    )

    Await Task.WhenAll(task1, task2)                '全タスクが終了するまで非同期的に待つ

    DirectCast(sender, Button).Enabled = True
End Sub

全てのタスクの処理が終了すると、Await以下の処理を実行します。

以下のようにListを使用して書くことも出来ます。

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    DirectCast(sender, Button).Enabled = False

    Dim tasks As New List(Of Task)

    tasks.Add(Task.Run(
        Sub()
            System.Threading.Thread.Sleep(5000)    '重たい処理
        End Sub
    ))

    tasks.Add(Task.Run(
        Sub()
            System.Threading.Thread.Sleep(5000)    '重たい処理
        End Sub
    ))

    Await Task.WhenAll(tasks)                       '全タスクが終了するまで非同期的に待つ

    DirectCast(sender, Button).Enabled = True
End Sub

 

Task.WhenAnyメソッドを使用して、どれかのタスクが終了するまで待つ

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    DirectCast(sender, Button).Enabled = False

    Dim tasks As New List(Of Task)

    tasks.Add(Task.Run(
        Sub()
            System.Threading.Thread.Sleep(10000)    '重たい処理
            Console.WriteLine("Task End1")
        End Sub
    ))

    tasks.Add(Task.Run(
        Sub()
            System.Threading.Thread.Sleep(5000)    '重たい処理
            Console.WriteLine("Task End2")
        End Sub
    ))

    Await Task.WhenAny(tasks)                      'どれかタスクが終了するまで非同期的に待つ

    Console.WriteLine("Task End")

    DirectCast(sender, Button).Enabled = True
End Sub

上記は、どちらかのタスクの処理が終了するとAwait以下の処理を実行します。