VB.NET BackgroundWorkerの使い方

(Visual Studio 2015 版)

投稿日 2015/10/17

[Home] | VB.NET インデックス

概要

Visual Studio で Windows.Forms アプリケーションを作るとき、ツールボックスの「コンポーネント」グループに backgroundWorker というコントロールがあります。これを使用すると、Windows.Forms アプリケーションにバックグランド動作を簡単に実装できます。


使い方

プロパティ

バックグランド処理を取り消すことができるか、途中経過を通知する必要があるかにより、次のプロパティをそれぞれ True にする必要があります。


イベント

DoWork イベントはバックグランド動作を記述するイベントハンドラなので必ず実装します。このメソッドを終了すると、バックグランド動作も終了します。

WorkerReportsProgress プロパティを True にしたときは、ProgressChanged イベントハンドラを実装します。スレッドを使って、フォームに描画する場合は、Invoke メソッドを使用して間接的に描画しますが、このイベントハンドラを使えばそれが不要です。

バックグランド動作が完了したことを通知するには、RunWorkerCompleted イベントハンドラを実装します。


メソッド

バックグランド動作を開始するには、RunWorkerAsync() メソッドを使用します。もし、途中でキャンセルしたいときは、CancelAsync() メソッドを使用します。


サンプルプログラム

次のサンプルは Start ボタンをクリックすると、バックグランドで1秒ごとにカウントダウンを行い、10秒経過すると完了通知のメッセージボックスを表示します。


Imports System.ComponentModel

''' <summary>
''' メインフォーム
''' </summary>
Public Class Form1
    ' バックグランド動作の秒数
    Const MAXCOUNT = 10
    
    ''' <summary>
    ''' Start ボタンがクリックされたとき
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If Button1.Text = "&Start" Then
            ' バックグランド動作を開始する。
            BackgroundWorker1.RunWorkerAsync()
            Button1.Text = "&Cancel"
        Else
            ' バックグランド動作を取り消す。
            '  (注意) BackgroundWorker1.WorkerSupportsCancelllation プロパティが
            ' True で   あることが必要。
            BackgroundWorker1.CancelAsync()
        End If
    End Sub
    
    ''' <summary>
    ''' バックグランド動作が開始されたとき
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub BackgroundWorker1_DoWork(sender As Object, e As _
       System.ComponentModel.Do   WorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim i = 0
        Dim worker = DirectCast(sender, BackgroundWorker)
        While i < MAXCOUNT
            If worker.CancellationPending Then
                e.Cancel = True
                Exit While
            End If
            Threading.Thread.Sleep(1000)  ' 1 秒スリープする。
            i += 1
            worker.ReportProgress(i * 10) ' 途中経過を表示する。
        End While
    End Sub
    
    ''' <summary>
    ''' バックグランド動作で状態変化が通知されたとき
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks>BackgroundWorker.WorkerReportsProgress プロパティが
    ''' True であることが必   要。</remarks>
    Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As _
      System.ComponentModel.ProgressChangedEventArgs) _
      Handles BackgroundWorker1.ProgressChanged
        Label1.Text = e.ProgressPercentage.ToString() + "%"
    End Sub
    
    ''' <summary>
    ''' バックグランド動作が終了したとき
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, _
      e As System.ComponentModel.RunWorkerCompletedEventArgs) _
      Handles BackgroundWorker1.RunWorkerCompleted
        Button1.Text = "&Start"
        MessageBox.Show("バックグランド動作が完了しました。", "情報")
    End Sub
End Class

 

 


 

 開設 2014年12月   著作権 2014-2015 bonk.red  連絡先: こちらからメッセージを送ってください。

 このページの先頭へ..