[BackgroundWorker][Tips] バックグランド操作にパラメーターを渡す


バックグラウンド操作を実行するとき(RunWorkerAsyncメソッド実行時)にはパラメーターを渡すことができます。

RunWorkerAsyncメソッドの引数に値を渡すと、バックグラウンド操作(DoWorkイベント)のe.Argumentプロパティで受け取ることができます。

下記は、バックグランド操作にパラメーターを渡す例です。

RunWorkerAsyncメソッドに100を渡して、DoWorkイベントで受け取り、ループの最大値として使用しています。

VBの例

' [START]ボタンクリック時の処理
Private Sub btnStart_Click(sender As System.Object, e As System.EventArgs) Handles btnStart.Click
    ' [START]ボタンを無効にする
    btnStart.Enabled = False

    '進捗状況の報告をできるようにする
    BackgroundWorker1.WorkerReportsProgress = True

    'バックグラウンド処理を開始する(パラメーターとして100を渡す)
    BackgroundWorker1.RunWorkerAsync(100)
End Sub

' 時間のかかる処理を実行する
Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    '★★★受け取ったパラメータをループの最大値にする★★★
    Dim iLoopMax As Integer = CInt(e.Argument)

    For I As Integer = 1 To iLoopMax
        '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;

    // ★★★バックグラウンド処理を開始する(パラメーターとして100を渡す)★★★
    backgroundWorker1.RunWorkerAsync(100);
}

// 時間のかかる処理を実行する
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    // ★★★受け取ったパラメータをループの最大値にする★★★
    int iLoopMax = (int)e.Argument;

    for (int i = 0; i < iLoopMax; 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;
}

コメントを残す

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