主婦と.NETと犬のぶろぐ

奥様 と プログラム と お犬様 の 楽しい日常

目次

Blog 利用状況

ニュース

書庫

日記カテゴリ

BackGroundWorker(System.ComponentModel.BackGroundWorker)

最近たるみすぎなので、ちょっと .NET Component の勉強でもしようと思います。
# ほとんど自分用のメモっぽくなりそうですが。
変なとこがあったら、コメントで突っ込んでください。

最初は BackGroundWorker です。なぜかっていうと、VS2005 の ToolBox の「すべての Windows フォーム」のいっちゃん上にあったので。

あるのは聞いてましたが、実は今まで一回も使ったことありませんでした。
ちょいハマったのは、CancelAsync を呼び出したら何もかんもやってくれるのかと思ってたら、そうでなかったとこでした。
わたしがアマアマすぎでした。

■参考文献
BackgroundWorker クラス
@IT Background Workerで夢のマルチスレッドがついに!

■実行画像
BackGroundWorker

Public Class BackGroundWorkerTest
    Private Sub BackGroundWorkerTest_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ' BackgroundWorker が非同期でやる仕事を通知できるように設定する。
        Me.BackgroundWorker1.WorkerReportsProgress = True
        ' BackgroundWorker が非同期でやる仕事をキャンセルできるように設定する。
        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
        ' BackgroundWorker の DoWork を(非同期で)呼び出す。
        Me.BackgroundWorker1.RunWorkerAsync()
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        ' BackgroundWorker の 仕事をキャンセルする。
        If Me.BackgroundWorker1.IsBusy Then
            Me.BackgroundWorker1.CancelAsync()
        End If
    End Sub
    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        ' 非同期でのお仕事
        For counter As Integer = 0 To 100
            If Me.BackgroundWorker1.CancellationPending Then
                ' キャンセルされてたらおしまい
                e.Cancel = True
                Return
            End If
            ' お仕事。
            System.Threading.Thread.Sleep(100)
            ' お仕事したことの通知(counter は進捗度合を渡す)
            Me.BackgroundWorker1.ReportProgress(counter)
        Next
    End Sub
    Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        ' 非同期のお仕事の進捗状況をプログレスバーに表示
        Me.ProgressBar1.Value = e.ProgressPercentage
    End Sub
    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        ' 非同期のお仕事がキャンセルにせよ、Exception にせよ、正常にせよ
        ' 終わったときに実行される
        If e.Cancelled Then
            MessageBox.Show("非同期でのお仕事はユーザーによりキャンセルされました")
        ElseIf Not e.Error Is Nothing Then
            MessageBox.Show("非同期でのお仕事中にエラーが発生しました")
        Else
            MessageBox.Show("非同期でのお仕事が終わりました!")
        End If
    End Sub
End Class

投稿日時 : 2006年12月6日 13:07

Feedback

No comments posted yet.
タイトル
名前
Url
コメント