using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace BGWorker1 {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
' [スタート]ボタンのイベント・ハンドラ
Private Sub buttonStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonStart.Click
buttonStart.Enabled = False
buttonCancel.Enabled = True
' 時間のかかる処理を別スレッドで開始
bgWorker.RunWorkerAsync(100)
' DoWorkイベント発生
End Sub
' [キャンセル]ボタンのイベント・ハンドラ
Private Sub buttonCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonCancel.Click
' 時間のかかる処理のキャンセル
bgWorker.CancelAsync()
End Sub
' 時間のかかる処理を行うメソッド
Private Sub bgWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgWorker.DoWork
' 別スレッドで実行されるため、このメソッドでは
' UI(コントロール)を操作してはいけない
' このメソッドへのパラメータ
Dim bgWorkerArg As Integer = CType(e.Argument, Integer)
' senderの値はbgWorkerの値と同じ
Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
' 時間のかかる処理
For i As Integer = 1 To bgWorkerArg
' キャンセルされてないか定期的にチェック
If worker.CancellationPending Then
e.Cancel = True
Return
End If
System.Threading.Thread.Sleep(100)
Dim percentage As Integer = i * 100 / bgWorkerArg ' 進ちょく率
worker.ReportProgress(percentage)
' ProgressChangedイベント発生
Next
' このメソッドからの戻り値
e.Result = "すべて完了"
' この後、RunWorkerCompletedイベントが発生
End Sub
Private Sub bgWorker_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgWorker.ProgressChanged
' 進ちょく状況の表示
Me.Text = e.ProgressPercentage & "%完了"
progressBar.Value = e.ProgressPercentage
End Sub
Private Sub bgWorker_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgWorker.RunWorkerCompleted
If e.Cancelled Then
MessageBox.Show("キャンセルされました")
' この場合にはe.Resultにはアクセスできない
Else
' 処理結果の表示
Me.Text = e.Result.ToString()
MessageBox.Show("正常に完了")
End If
buttonStart.Enabled = True
buttonCancel.Enabled = False
End Sub
End Class