[BackgroundWorker][Tips] 時間のかかる処理をバックグラウンドで実行する


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;
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です