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:
コメント