.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