HIRO's.NET

VB.NET, C#, PowerShell Tipsサイト

 VB.NET, C#, PowerShellを使用しているエンジニアのためのサイト。

 基本的な使用方法から開発で役立つTipsまで幅広く取り扱っています。

HIRO's.NET RSSHIRO's.NET RSS


VB.NET 2005の開発でお困りのことはありませんか?
そんな悩みは当サイトで解決!!

HOME > VB.NET 2005 Tips > コントロール > BackGroundWorker Tips メニュー

04.バックグラウンド処理の終了を判断する

UPDATE:2007/03/16 

<< 前のTips  次のTips >>

 

 バックグラウンド処理が終了すると、RunWorkerCompletedイベントが発生します。(このイベントは、バックグラウンド処理が正常終了、例外発生時、バックグラウンド処理のキャンセル時のいずれかで発生します)
 イベントのe.errorがNothing以外は例外が発生したことを示し、e.CancelledプロパティがTrueの場合はバックグラウンド処理がキャンセルされたことを示します。

 
サンプル
Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    '進捗状況を報告できるようにする
    Me.BackgroundWorker1.WorkerReportsProgress = True
    'バックグラウンド操作をキャンセルできるようにする
    Me.BackgroundWorker1.WorkerSupportsCancellation = True

    'プログレスバーの初期化
    Me.ProgressBar1.Minimum = 0
    Me.ProgressBar1.Maximum = 100
End Sub

'バックグランド処理実行用ボタンクリック時の処理
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    '進捗状況の初期化
    Me.ProgressBar1.Value = 0

    'バックグラウンド操作の実行を開始する
    Me.BackgroundWorker1.RunWorkerAsync()
End Sub

'バックグランドキャンセル用ボタンクリック時の処理
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    If Me.BackgroundWorker1.IsBusy Then
        'バックグランド処理をキャンセルする
        Me.BackgroundWorker1.CancelAsync()
    End If
End Sub

Private Sub BackgroundWorker1_DoWork( _
    ByVal sender As Object, _
    ByVal e As System.ComponentModel.DoWorkEventArgs) _
    Handles BackgroundWorker1.DoWork

    For I As Integer = 0 To 100
        '処理中にキャンセルされていないかを定期的にチェックする
        If Me.BackgroundWorker1.CancellationPending Then
            e.Cancel = True
            Return
        End If

        '進捗状況の報告
        Me.BackgroundWorker1.ReportProgress(I)

        If I = 50 Then
            'わざと例外を発生させる
            Throw New ApplicationException("例外発生")
        End If
        System.Threading.Thread.Sleep(100)
    Next

End Sub

'バックグラウンド操作の進捗状況を把握
Private Sub BackgroundWorker1_ProgressChanged( _
    ByVal sender As System.Object, _
    ByVal e As System.ComponentModel.ProgressChangedEventArgs) _
    Handles BackgroundWorker1.ProgressChanged

    '進捗状況をプログレスバーに表示
    Me.ProgressBar1.Value = e.ProgressPercentage

End Sub

'バックグラウンド処理の終了を判断する
Private Sub BackgroundWorker1_RunWorkerCompleted( _
    ByVal sender As System.Object, _
    ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) _
    Handles BackgroundWorker1.RunWorkerCompleted

    If Not (e.Error Is Nothing) Then
        MessageBox.Show("例外が発生しました")
    ElseIf e.Cancelled Then
        MessageBox.Show("キャンセルされました")
    Else
        MessageBox.Show("正常終了しました")
    End If
End Sub