Taskクラスを使用して非同期処理をする際、同期をとるためのタスク待ちについて記載します。
ここでは、非同期の処理待ちをする事ができる Async & AWait と Wait()メソッドを説明します。
プログラムを起動したときのメインタスクは、UIタスク(ユーザインターフェースタスク)で、Taskクラスで起動するタスクは、ローカルタスクと以下記載します。
Async と AWait でのタスク待ち
GUIでボタンを押して重たい処理する場合を例にします。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
System.Threading.Thread.Sleep(10000) '重たい処理
End Sub
以上の処理を実行すると、処理が終了するまで、フォーム移動などの操作が出来なくなります。
次にTaskクラスを使用して処理を実行します。
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
DirectCast(sender, Button).Enabled = False 'ボタンを選択できないようにする
Dim task As Task = Task.Run(
Sub()
System.Threading.Thread.Sleep(10000) '重たい処理
End Sub
)
Await task '処理が完了するのを非同期的に待つ
MessageBox.Show("Task End")
DirectCast(sender, Button).Enabled = True
End Sub
Async & Await の非同期メソッドで、UIスレッドに同期的な継続処理に自動変換されます。
上記では、ローカルタスクで処理が実行されるので、ボタンの選択は処理が終わるまで出来ませんが、フォームの操作は出来ます。
Await で処理を止めているのではなく、非同期的に待っているので、UIタスクに処理を戻します。
ローカルタスクでの処理が終了したら、MessageBox.Show(“Task End”)が実行されます。
上記のコードの省略化
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
DirectCast(sender, Button).Enabled = False 'ボタンを選択できないようにする
Await Task.Run(
Sub()
System.Threading.Thread.Sleep(10000) '重たい処理
End Sub
)
MessageBox.Show("Task End")
DirectCast(sender, Button).Enabled = True
End Sub
戻り値がある場合
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
DirectCast(sender, Button).Enabled = False 'ボタンを選択できないようにする
Dim result As Boolean = Await Task.Run(
Function() As Boolean
System.Threading.Thread.Sleep(5000)
Return True
End Function
)
MessageBox.Show("Task End")
DirectCast(sender, Button).Enabled = True
End Sub
・Task.Run()の場合は、Task(Of)の戻り値になります。
・Await Task.Run()の場合は、指定した戻り値になります。
Waitメソッドでの処理待ち
GUIで Wait() メソッドを使用することは、通常ありません。
以下のようにCUIの時、Awaitをおこなっても処理が終了しまう場合、に使用します。
Imports System.Threading
Module Module1
Sub Main()
Dim task As Task = Task.Run(
Sub()
System.Threading.Thread.Sleep(5000) '重たい処理
Console.WriteLine("Task End")
End Sub
)
task.Wait()
Console.WriteLine("End")
End Sub
End Module