BackgroundWorkerコンポーネント

.NetFramework2.0からのマルチスレッドを実現するための機能


BackgroundWorkerコンポーネントを使用するとプログレスバーの表示、処理のキャンセルなどの
マルチスレッドのプログラムを作成することができる


ツールボックス」→「コンポーネント」→「BackgroundWorker」をフォームに貼り付けることで使用できる



以下、処理を実行してプログレスバーを表示&キャンセルの機能を実装したプログラム例


'BackgroundWorkerクラスを使うためのインポート宣言
Imports System.ComponentModel

Public Class Form1

    '実行ボタン
    Private Sub Button1_Click(ByVal sender As Object, _
            ByVal e As System.EventArgs) Handles Button1.Click

        'BackgroundWorkerが実行中か判断する
        If BackgroundWorker1.IsBusy Then
            Return
        End If

        'ProgressBar1を初期化
        ProgressBar1.Minimum = 0
        ProgressBar1.Maximum = 10
        ProgressBar1.Value = 0
        Label1.Text = ""

        'ProgressChangedイベントを発生させる
        BackgroundWorker1.WorkerReportsProgress = True
        'キャンセル可能とする
        BackgroundWorker1.WorkerSupportsCancellation = True

        'DoWorkの実行開始
        BackgroundWorker1.RunWorkerAsync()
    End Sub

    'キャンセルボタン
    Private Sub Button2_Click(ByVal sender As Object, _
            ByVal e As System.EventArgs) Handles Button2.Click
        
        'キャンセルする
        BackgroundWorker1.CancelAsync()
    End Sub

    'BackgroundWorker1のDoWorkイベントハンドラ
    'メイン処理の記述箇所
    Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, _
            ByVal e As DoWorkEventArgs) _
            Handles BackgroundWorker1.DoWork

        Dim bgWorker As BackgroundWorker = DirectCast(sender, BackgroundWorker)
        Dim i As Integer

        '★このイベント内に処理の遅い命令を記述する
        For i = 1 To 10

            'キャンセルされたか調べる
            If bgWorker.CancellationPending Then
                'キャンセルされたとき
                e.Cancel = True
                Return
            End If

            '1秒間待機する(処理が遅くするための仮想の命令)
            System.Threading.Thread.Sleep(1000)

            'ProgressChangedイベントの呼び出し
            bgWorker.ReportProgress(i)
        Next

    End Sub

    'ProgressChangedイベント
    Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, _
            ByVal e As ProgressChangedEventArgs) _
            Handles BackgroundWorker1.ProgressChanged

        'プログレスバーの描画
        ProgressBar1.Value = e.ProgressPercentage
        Label1.Text = e.ProgressPercentage.ToString()

    End Sub

    'RunWorkerCompletedイベント
    '(DoWorkイベントが完了したときに呼び出される)
    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, _
            ByVal e As RunWorkerCompletedEventArgs) _
            Handles BackgroundWorker1.RunWorkerCompleted

        '完了の状態をラベルに出力
        If Not e.Error Is Nothing Then

            Label1.Text = "エラー:" & e.Error.Message

        ElseIf e.Cancelled = True Then

            Label1.Text = "キャンセル"
        Else

            Label1.Text = "完了"
        End If

    End Sub

    
End Class

●BackgroundWorkerの主なイベント、メソッド等は以下の通り



DoWorkイベント
→メイン処理を記述するイベント
 RunWorkerAsyncメソッドを実行することで呼び出される


ProgressChangedイベント
→進行状況をユーザに通知するコードを記述するためのイベント
 ReportProgressメソッドを実行することで呼び出される


RunWorkerCompletedイベント
→DoWorkイベントが完了したときに発生するイベント
 キャンセル、エラーのときもこのイベントが発生する




RunWorkerAsyncメソッド
→DoWorkイベントを実行するメソッド


ReportProgressメソッド
→ProgressChangedイベントを実行するメソッド


CancelAsyncメソッド
→DoWorkイベントをキャンセルするメソッド
 このメソッドが実行されるとRunWorkerCompletedイベントが発生する



WorkerReportsProgressプロパティ
→ReportProgressメソッドを発生させるにはTrueにしておくこと


WorkerSupportsCancellationプロパティ
→CancelAsyncメソッドを実行するにはにはTrueにしておくこと




動作確認環境:Visual Stadio 2005