Back to Top

プログラムの覚書

Category: VB.NET

VB.NET

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

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

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

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

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

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

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

Dim task As Task = New Task(                   'タスクの作成
    Sub()
        System.Threading.Thread.Sleep(5000)    '重たい処理
    End Sub
)
task.Start()                                   'タスク開始

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

Dim task As Task = Task.Factory.StartNew(      'タスクを作成してタスクを起動
    Sub()
        System.Threading.Thread.Sleep(5000)    '重たい処理
    End Sub
)

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

Dim task As Task = Task.Run(                   'タスクを作成してタスクを起動
    Sub()
        System.Threading.Thread.Sleep(5000)    '重たい処理
    End Sub
)

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

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

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

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

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

Dim result As Task(Of Integer) = New Task(
    Function() As Integer
        System.Threading.Thread.Sleep(5000)     '重たい処理
        Return 1
    End Function
)
result.Start()                                  'タスク起動

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

Dim result As Task(Of Integer) = Task.Factory.StartNew(
    Function() As Integer
        System.Threading.Thread.Sleep(5000)    '重たい処理
        Return 1
    End Function
)

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

Dim result As Task(Of Integer) = Task.Run(
    Function() As Integer
        System.Threading.Thread.Sleep(5000)    '重たい処理
        Return 1
    End Function
)

 

引数のあるタスクの起動

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

Public Class TaskActionClass
    '引数のある関数
    Public Sub Action1(count As Integer)
        For i As Integer = 0 To count
            System.Threading.Thread.Sleep(1000)
        Next
    End Sub

    '引数と戻り値のある関数
    Public Function Action2(count As Integer) As Integer
        For i As Integer = 0 To count
            System.Threading.Thread.Sleep(1000)
        Next
        Return count
    End Function
End Class

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

Dim act1 = New TaskActionClass()

Dim t As Task = Task.Run(Sub() act1.Action1(5))
'または
Dim t As Task = New Task(AddressOf act1.Action1, 5)
t.Start()

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

Dim act1 = New TaskActionClass()

Dim t = Task.Run(Function() act1.Action2(5))
'また厳密には
Dim t As Task(Of Integer) = Task.Run(Function() act1.Action2(5))

 

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

 

VB.NET WebClient asyncとawaitの使い方

 WebClientクラスを使用して async と await の基本的な使い方の説明を記載します。

使用するメソッドは、同期(DownloadString)、非同期(DownloadStringTaskAsync)を使用して説明します。

同期メソッドDownloadString を使用してダウンロード

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim url As Uri = New Uri("http://microsoft.com")

    Dim client = New WebClient()

    Debug.WriteLine("--- Start ---")
    Dim s = client.DownloadString(url)
    Debug.WriteLine(s)
    Debug.WriteLine("--- End ---")
End Sub

表示結果は

--- Start ---
<html><head> ・・・(省略)
--- End ---

次に

非同期メソッドDownloadStringTaskAsync を使用してダウンロード

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim url As Uri = New Uri("http://microsoft.com")

    Dim client = New WebClient()

    Debug.WriteLine("--- Start ---")
    Dim s = client.DownloadStringTaskAsync(url)
    Debug.WriteLine(s)
    Debug.WriteLine("--- End ---")
End Sub

表示結果

--- Start ---
System.Threading.Tasks.Task`1[System.String]
--- End ---

ダウンロードされた内容が取得できません。

そこで、Async と Await を使用して内容を取得します。

非同期での Async と Awaitの使用方法

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim url As Uri = New Uri("http://microsoft.com")

    Dim client = New WebClient()

    Debug.WriteLine("--- Start ---")

    Dim task As Task(Of String) = client.DownloadStringTaskAsync(url)
    Debug.WriteLine(task)
    Debug.WriteLine("--- End ---")

    Debug.WriteLine("--- Await Start ---")
    Dim s As String = Await task            'ここで処理待ちをする
    Debug.WriteLine(s)
    Debug.WriteLine("--- Await End ---")
End Sub

表示結果

--- Start ---
System.Threading.Tasks.Task`1[System.String]
--- End ---
--- Await Start ---
<html><head> ・・・省略

--- Await End ---

上記のいらないところを消して簡単にすると

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim url As Uri = New Uri("http://microsoft.com")

    Dim client = New WebClient()
    Dim s As String = Await client.DownloadStringTaskAsync(url)
    Debug.WriteLine(s)
End Sub