Back to Top

プログラムの覚書

Category: VB.NET

VB.NET

VB.NET HttpClientでGET要求でデータダウンロード

HttpClientクラスで、GET要求にて指定URL(URI)から非同期でデータをダウンロードする方法を記載します。

・System.Netをインポートする

GetStringAsync()メソッドにて、URL(URI)から文字列としてダウンロードする

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

    Dim url As Uri = New Uri("http://microsoft.com")
    Dim html As String

    Using HttpCl As New HttpClient()
        html = Await HttpCl.GetStringAsync(url)
    End Using

    'ダウンロードしたデータを表示する
    Console.WriteLine(html)

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

 

GetByteArrayAsync()メソッドにて、URLからバイナリーデータとしてダウンロードする

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

    Dim url As Uri = New Uri("http://microsoft.com")

    Using HttpCl As New HttpClient()
        Data = Await HttpCl.GetByteArrayAsync(url)
    End Using

    'ダウンロードしたデータを表示する
    Dim str As String = System.Text.Encoding.UTF8.GetString(Data)    'バイト配列を文字列に変換
    Console.WriteLine(str)

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

 

GetStreamAsync()メソッドにて、URLからストリームで読み込む

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

    Dim url As Uri = New Uri("http://microsoft.com")
    Dim str As String

    Using HttpCl As New HttpClient()
        Dim dt As System.IO.Stream = Await HttpCl.GetStreamAsync(url)           'データを読み取るStreamを開く
        Dim sr As New System.IO.StreamReader(dt, System.Text.Encoding.UTF8)
        str = sr.ReadToEnd()
        dt.Close()
    End Using

    'ダウンロードしたデータを表示する
    Console.WriteLine(str)

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

 

GetAsync()メソッドで、URL(URI)からダウンロードする

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

    Dim url As Uri = New Uri("http://microsoft.com")
    Dim str As String

    Using HttpCl As New HttpClient()
        'ヘッダー部作成
        HttpCl.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko")
        HttpCl.DefaultRequestHeaders.Add("Accept-Language", "ja-JP")
        HttpCl.Timeout = TimeSpan.FromSeconds(5.0)

        Using response = Await HttpCl.GetAsync(url)
            str = Await response.Content.ReadAsStringAsync()
        End Using
    End Using

    'ダウンロードしたデータを表示する
    Console.WriteLine(str)

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

 

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

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

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

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

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

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

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

Dim cts As CancellationTokenSource

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    cts = New CancellationTokenSource()    
    Try
        Dim t = ActionAsync(cts.Token)          'タスクの実行
        Await t                                 '非同期的に完了待ち
    Catch ex As OperationCanceledException
        MessageBox.Show("キャンセルされました")
    End Try
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    cts.Cancel()        'タスクのキャンセル要求
End Sub

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

Async Function ActionAsync(token As CancellationToken) As Task(Of Boolean)
    Dim result As Boolean = Await Task.Run(
         Function() As Boolean
             For i As Integer = 0 To 100
                 token.ThrowIfCancellationRequested()           'キャンセル時の処理
                 Thread.Sleep(1000)
             Next
             Return True
         End Function
    )

    MessageBox.Show("タスク終了")
    Return result
End Function

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

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

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

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

If (token.IsCancellationRequested) Then
    Throw New OperationCanceledException(token)
End If

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

token.ThrowIfCancellationRequested()

 

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

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

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

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

Async Function ActionAsync(token As CancellationToken) As Task(Of Task)
    Dim result As Task = Task.Run(
         Sub()
             While True
                 If (token.IsCancellationRequested) Then     'キャンセル時の処理
                    Exit While
                 End If
                 Thread.Sleep(1000)
             End While
         End Sub
    )
    Await result

    MessageBox.Show("タスク終了")
    Return result
End Function