Back to Top

VB・C#・Linux などの覚書

Category: スレッド・タスク

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をおこなっても処理が終了しまう場合、に使用します。

 

VB.NET Taskクラス基本的な起動

Taskクラスを使用して、非同期処理を実行する場合、タスクの起動方法には、数通りの起動方法があります。

ここでは、タスクの起動方法について記載します。

Taskクラスは、NET Framework 4.0から使用できます。

・System.Threadingをインポートします。

戻り値の無いタスクの起動

Task.Start()を使用する方法

Task.Factory.StartNew()を使用する方法

Task.Run()を使用する方法

Task.Run()は、.NET Framework4.5 から使用できます。
 

戻り値のあるタスクの起動

戻り値のあるタスクは、Task(Of TResult)の型を使用します。

以下の例は、Integer型の値を返すTask(Of Integer)です。

Task.Start()を使用する方法

Task.Factory.StartNew()を使用する方法

Task.Ran()を使用する方法

 

引数のあるタスクの起動

タスクで呼び出す関数クラスの例

戻り値なし・引数あり 関数をタスク起動

戻り値あり・引数あり 関数をタスク起動

 

※タスクの起動のコーディングには、いろいろな方法があります。NET Frameworkのバージョンによっても異なりますので、状況に合わせて使用してください。