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