BackgroundWorkerコンポーネントを使用すると、時間のかかる処理をバックグラウンドで実行することができます。
BackgroundWorkerでバックグラウンド処理を開始するにはRunWorkerAsyncメソッドを実行します。
RunWorkerAsyncメソッドを実行すると、DoWorkイベントが発生します。
時間のかかる処理は、このDoWorkイベント内に記述します。
また、BackgroundWorkerでは進捗を管理することができ、ProgressChangedイベントで進捗状況を更新する処理を記述します。
ProgressChangedイベントは、DowWorkイベント内でReportProgressメソッドを実行することで、発生させることができます(事前にWorkerReportsProgressプロパティにTrueを設定しておく必要があります)。ReportProgressメソッドの引数には、現在の進捗率0~100%を渡す必要があることに注意してください。進捗状況の割合はe.ProgressPercentageプロパティで取得することができます。
最後に、バックグランド処理が完了するとRunWorkerCompletedイベントが発生します。
まとめると下記の手順となります
- バックグラウンド処理の実行はRunWorkerAsyncメソッドを実行
- 時間のかかる処理はDoWorkイベントに記述
- 進捗状況はProgressChangedイベントに記述(あらかじめWorkerReportsProgressプロパティにTrueを設定)
- 終了処理はRunWorkerCompletedイベントに記述
下記は、時間のかかる処理をバックグラウンドで実行する例です。
[START]ボタンが押されると、時間がかかる処理(200mSecのスリープを100回繰り返しています)を実行し、プログレスバーを進捗させます。
VBの例
' [START]ボタンクリック時の処理
Private Sub btnStart_Click(sender As System.Object, e As System.EventArgs) Handles btnStart.Click
' [START]ボタンを無効にする
btnStart.Enabled = False
'進捗状況の報告をできるようにする
BackgroundWorker1.WorkerReportsProgress = True
'バックグラウンド処理を開始する
BackgroundWorker1.RunWorkerAsync()
End Sub
' 時間のかかる処理を実行する
Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
For I As Integer = 1 To 100
'200mSecスリープさせる
System.Threading.Thread.Sleep(200)
'ProgressChangedイベントを発生させる
BackgroundWorker1.ReportProgress(I)
Next
End Sub
' 進捗状況を更新する
Private Sub BackgroundWorker1_ProgressChanged(sender As System.Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
'プログレスバーを進捗させる
ProgressBar1.Value = e.ProgressPercentage
End Sub
' バックグラウンド処理完了時の処理
Private Sub BackgroundWorker1_RunWorkerCompleted(sender As System.Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
'バックグラウンド処理が完了したので[START]ボタンを有効にする
btnStart.Enabled = True
End Sub
C#の例
// [START]ボタンクリック時の処理
private void btnStart_Click(object sender, EventArgs e)
{
// [START]ボタンを無効にする
btnStart.Enabled = false;
// 進捗状況の報告をできるようにする
backgroundWorker1.WorkerReportsProgress = true;
// バックグラウンド処理を開始する
backgroundWorker1.RunWorkerAsync();
}
// 時間のかかる処理を実行する
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 100; i++)
{
// 200mSecスリープさせる
System.Threading.Thread.Sleep(200);
// ProgressChangedイベントを発生させる
backgroundWorker1.ReportProgress(i + 1);
}
}
// 進捗状況を更新する
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// プログレスバーを進捗させる
progressBar1.Value = e.ProgressPercentage;
}
// バックグラウンド処理完了時の処理
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// バックグラウンド処理が完了したので[START]ボタンを有効にする
btnStart.Enabled = true;
}
Please follow and like us:
コメント