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