最近たるみすぎなので、ちょっと .NET Component の勉強でもしようと思います。
# ほとんど自分用のメモっぽくなりそうですが。
変なとこがあったら、コメントで突っ込んでください。
最初は BackGroundWorker です。なぜかっていうと、VS2005 の ToolBox の「すべての Windows フォーム」のいっちゃん上にあったので。
あるのは聞いてましたが、実は今まで一回も使ったことありませんでした。
ちょいハマったのは、CancelAsync を呼び出したら何もかんもやってくれるのかと思ってたら、そうでなかったとこでした。
わたしがアマアマすぎでした。
■参考文献
BackgroundWorker クラス
@IT Background Workerで夢のマルチスレッドがついに!
■実行画像
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