VB.NET Taskクラスの処理キャンセル

タスクを実行した際、途中でキャンセルしたいことがあります。その際の方法を記載します。

Taskクラス によるタスクキャンセルは、CancellationTokenSourceクラスを使用します。

タスクキャンセル要求は、CancellationTokenSource.Cancel()メソッドを実行します。

これによりキャンセルフラグが立ち、このフラグを参照することによりキャンセル処理を実行します。

ThrowIfCancellationRequested()によるキャンセル方法

オペレーション側プログラム

タスク側プログラム(ThrowIfCancellationRequestedメソッド抜け出し)

CancellationToken構造体のThrowIfCancellationRequested()メソッドで、キャンセルフラグをチェックします。

また、実際のキャンセルフラグは、CancellationToken.IsCancellationRequestedプロパティに設定されていて

このフラグが立ったらタスク側は、OperationCanceledException例外をスローするように作成します。

キャンセルフラグの例外スローのコードは、以下のコードのようになります。

上記を一文で書けるようにメソッドが用意されています。

 

例外のスローではない IsCancellationRequestedでのキャンセル抜け出し

ThrowIfCancellationRequested()での抜け出しは、 例外スローするので、上に記載したコードではキャンセルの際、MessageBox.Show(“タスク終了”)実行されません。

そこで、IsCancellationRequestedを参照して抜け出すようにします。

タスク側プログラム(IsCancellationRequestedプロパティ抜け出し)

 

VB.NET Taskクラスで複数タスクを非同期的に待つ

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

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

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

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

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

 

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

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

 

VB.NET Taskクラスの処理待ちの方法

Taskクラスを使用して非同期処理をする際、同期をとるためのタスク待ちについて記載します。

ここでは、非同期の処理待ちをする事ができる Async & AWait  と Wait()メソッドを説明します。

プログラムを起動したときのメインタスクは、UIタスク(ユーザインターフェースタスク)で、Taskクラスで起動するタスクは、ローカルタスクと以下記載します。

Async と AWait でのタスク待ち

GUIでボタンを押して重たい処理する場合を例にします。

以上の処理を実行すると、処理が終了するまで、フォーム移動などの操作が出来なくなります。

次にTaskクラスを使用して処理を実行します。

Async & Await の非同期メソッドで、UIスレッドに同期的な継続処理に自動変換されます。

上記では、ローカルタスクで処理が実行されるので、ボタンの選択は処理が終わるまで出来ませんが、フォームの操作は出来ます。

Await で処理を止めているのではなく、非同期的に待っているので、UIタスクに処理を戻します。

ローカルタスクでの処理が終了したら、MessageBox.Show(“Task End”)が実行されます。

上記のコードの省略化

戻り値がある場合

・Task.Run()の場合は、Task(Of)の戻り値になります。

・Await Task.Run()の場合は、指定した戻り値になります。

 

Waitメソッドでの処理待ち

GUIで Wait() メソッドを使用することは、通常ありません。

以下のようにCUIの時、Awaitをおこなっても処理が終了しまう場合、に使用します。