VB:BackgroundWorkerを使ったスレッド処理

Imports System.ComponentModel
Imports System.Threading
Public Class Form1

'スレッド開始ボタン処理
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

'処理が行われているときは、何もしない
If BackgroundWorker1.IsBusy Then
Return
End If

Button1.Enabled = False
Button2.Enabled = True

'BackgroundWorkerのProgressChangedイベントが発生するようにする
BackgroundWorker1.WorkerReportsProgress = True

'キャンセルできるようにする
BackgroundWorker1.WorkerSupportsCancellation = True

Form2.Show()

'BackgroundWorker処理開始
BackgroundWorker1.RunWorkerAsync()

End Sub

'スレッド停止ボタン処理
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

Button1.Enabled = True
Button2.Enabled = False

Label1.Text = Form2.Label1.Text

Form2.Close()

'キャンセルする
BackgroundWorker1.CancelAsync()

End Sub

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.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

System.Threading.Thread.Sleep(1000)

bgWorker.ReportProgress(i)
Next

e.Result = 10
Form2.Label1.Text = "10deg"

End Sub

'スレッド中の処理
Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object,
ByVal e As ProgressChangedEventArgs) _
Handles BackgroundWorker1.ProgressChanged

'Label1のテキストを変更する
Form2.Label1.Text = e.ProgressPercentage.ToString() & "deg"
Form2.Label2.Text = "目標は10deg"

End Sub

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 Then
'キャンセルされたとき
Else
'正常に終了したとき
'結果を取得する
Dim result As Integer = CInt(e.Result)
Label1.Text = result.ToString() & "deg"
End If

Thread.Sleep(1000)

Form2.Close()

Button1.Enabled = True
Button2.Enabled = False

End Sub

End Class