BackgroundWorker (バックグラウンドワーカー)コントロールを使用する
BackgroundWorkerコントロールを使用して、別スレッドで時間のかかる処理を実行します。
画面設計
下図の画面を準備します。Button,BackgroundWorker, TextBoxを一つずつ用意します。
BackgroundWorkerコントロールの[DoWork]イベントと[RunWorkerCompleted]イベント、ButtonのClickイベントにコードを記述します。コード全体は下記になります。
コード
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace BackgroundWorkerDemo
{
public partial class FormMain : Form
{
public int ans = 0;
public FormMain()
{
InitializeComponent();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
ans = 0;
for (int i = 0; i <= 100; i++) {
for (int j = 0; j < 100; j++) {
ans = ans + i + i * j;
}
System.Threading.Thread.Sleep(5);
}
}
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_RunWorkerCompleted
(object sender, RunWorkerCompletedEventArgs e)
{
textBox1.Text += string.Format("{0:d}\r\n", ans);
}
}
}
解説 BackgroundWorker - DoWorkイベント
ans = 0;
for (int i = 0; i <= 100; i++) {
for (int j = 0; j < 100; j++) {
ans = ans + i + i * j;
}
System.Threading.Thread.Sleep(5);
}
時間のかかる処理を実装します。2重ループで10000回の計算を実行します。
System.Threading.Thread.Sleep(5);
にて、100回に1度5ミリ秒スレッドを停止させより時間がかかる処理にしています。
注意
DoWorkイベントは別スレッドで実行されるため、textBox1などのフォーム内のコントロールにアクセスすることはできません。
解説 BackgroundWorker - RunWorkerCompletedイベント
textBox1.Text += string.Format("{0:d}\r\n", ans);
RunWorkerCompletedイベントはDoWorkイベントが終了した時点で呼び出されます。DoWorkイベントで計算した内容をTextBoxに表示します。RunWorkerCompletedイベントはメインスレッドで実行されるためtextBox1への参照は可能です。
解説 Button - Clickイベント
backgroundWorker1.RunWorkerAsync();
にて、BackgroundWorkerコントロールを非同期実行します。DoWorkerイベント内のコードが非同期(別スレッド)で実行されます。
実行結果
アプリケーションを起動すると下図の画面が表示されます。
ボタンを押すとBackgroundWorkerに記述した時間のかかる処理が実行されます。処理が終了すると計算結果がテキストボックスに表示されます。
このプログラムで重要な点は、時間のかかる処理が実行されている間もフォームの移動やテキストボックスへの文字の入力などができることです。メインスレッドで同様の処理を実行した場合計算中はフォームが固まってしまいます。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用