目次

BackgroundWorker (バックグラウンドワーカー) の処理状況を表示する - C#

BackgroundWorker (バックグラウンドワーカー)で処理の進行状況を表示する方法を紹介します。

UI

下図のUIを作成します。ボタン、テキストボックス、プログレスバー、BackgroundWorker(バックグラウンドワーカー)を配置します。


BackgroundWorker(バックグラウンドワーカー)のプロパティです。"WorkerReportsProgress"プロパティを"True"に設定します。


テキストボックスのプロパティです。"Multiline"プロパティを"True"にします。

コード

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BackgroundWorkerProgressDemo
{
  public partial class FormMain : Form
  {
    public int ans = 0;

    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
      ans = 0;
      int percent = 0;
      int loop = 200;

      for (int i = 0; i < loop; i++) {
        percent = (int)(((double)i / (double)loop) * 100f);

        for (int j=0; j<1000; j++){
          ans = ans + i + i * j;
        }
        System.Threading.Thread.Sleep(1);
        backgroundWorker1.ReportProgress(percent); 
      }
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
      textBox1.Text = "処理が終了しました。\r\n";
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
      progressBar1.Value = e.ProgressPercentage;
    }
  }
}

解説

  private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
  {
    ans = 0;
    int percent = 0;
    int loop = 200;

    for (int i = 0; i < loop; i++) {
      percent = (int)(((double)i / (double)loop) * 100f);

      for (int j=0; j<1000; j++){
        ans = ans + i + i * j;
      }
      System.Threading.Thread.Sleep(1);
      backgroundWorker1.ReportProgress(percent); 
    }
  }
上記のコードがBackgroundWorkerの処理部です。BackgroundWorkerで処理状況を通知する場合は、BackgroundWorkerコントロールの。"WorkerReportsProgress"プロパティを"True"に設定し、backgroundWorkerのReportProgress()メソッドを呼び出すことで処理状況を通知できます。
ReportProgressメソッドの引数には進行状況を示すパーセンテージを与えます。ReportProgressメソッドには2つの引数をとるメソッドもあり、こちらを用いる場合は進行状況を示すパーセンテージと任意のオブジェクトを渡せます。

  private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  {
    textBox1.Text = "処理が終了しました。\r\n";
  }

  private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
  {
    progressBar1.Value = e.ProgressPercentage;
  }
BackgroundWorkerの処理が終了すると、RunWorkerCompletedイベントが呼び出され、テキストボックスに終了のメッセージが表示されます。また、BackgourndWorkerのReportProgress()メソッドを呼び出すとProgressChangedイベントが呼び出されます。BackgroundWorkerの、DoWorkイベントは別スレッドで動作するため、フォームのコントロールにはアクセスできませんが、RunWorkerCompletedイベントやProgressChangedイベントはメインスレッドで動作するため、フォームのコントロールにアクセスできます。

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[Button]をクリックします。処理が始まります。処理が進むごとにプログレスバーのゲージが埋まっていきます。


プログレスバーが埋まり、処理が終わるとテキストボックスに処理が終わった旨のメッセージが表示されます。


著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2017-09-14
作成日: 2013-07-29
iPentec all rights reserverd.