|
■No69386 (魔界の仮面弁士) に追記
> まずは、BackgroundWorker コンポーネントを試してみるのが良いでしょう。
ということで、まずはサンプル。
(1) Form1 に、BackgroundWorker を貼り付ける。
(2) backgroundWorker1 の WoekerReportsProgress を True に設定。
(3) backgroundWorker1 のイベントを、3つとも割り当てる(DoWork/ProgressChanged/RunWorkerCompleted)。
(4) テスト用に、起動ボタン(button1)とラベル(label1)も貼っておく。
コードとしてはこんな感じ。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 別スレッドに長い処理を行わせるための起動ボタン
/// </summary>
private void button1_Click(object sender, EventArgs e)
{
UseWaitCursor = true;
label1.Text = "はじまるよー";
backgroundWorker1.RunWorkerAsync(480); // 長い処理の開始を依頼
// 別スレッドに作業を依頼した後、
// UI スレッド側の button1_Click を抜ける。
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// ここは、UI スレッド側で実行される処理。
// 処理中の状況を画面に通知するなどに使われる。
label1.Text = (string)e.UserState;
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker bgw = (BackgroundWorker)sender;
int f = (int)e.Argument; // 呼び出し元から渡された任意のパラメータ
System.Threading.Thread.Sleep(f); // 何かの長い処理
bgw.ReportProgress(0, "進捗報告1回目"); // 中間報告
System.Threading.Thread.Sleep(f); // 何かの長い処理
bgw.ReportProgress(0, "進捗報告2回目"); // 中間報告
System.Threading.Thread.Sleep(f); // 何かの長い処理
// 処理結果を返す
e.Result = "終わったよー"; // ここでは文字列を返している
Cursor.Current = Cursors.Default;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// ここは、別スレッドでの作業が終わった後に呼び出される処理。
label1.Text = (string)e.Result; // 結果を受け取って画面に表示
UseWaitCursor = false;
}
}
|