いくつかのBackgroundWorker要素を使用して、バックグラウンドで処理を行う単純な Windows フォーム アプリがあります。開発中に.Text
、メソッドで Label の値を取得および設定するDoWork()
ことはできるが、DrowDownList の値を取得できないことに気付きました。
BackgroundWorker は UI インタラクションを持たないという印象を受けましたが、このルールに例外はありますか?
BackgroundWorker から UI を更新するための提案を探しているわけではありません。BackgroundWorker から直接 ToolStripStatusLabel のテキストを更新するなど、実行できるショートカットがあるかどうかに興味があります。
以下は単純な例です。ワーカー 1 は UI を直接更新し、ワーカー 2 は進行状況の更新を使用します。
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
private void button2_Click(object sender, EventArgs e)
{
backgroundWorker2.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
toolStripStatusLabel1.Text = "Performing task 1...";
performTaskOne();
toolStripStatusLabel1.Text = "Task 1 done.";
toolStripStatusLabel1.Text = "Performing task 2...";
performTaskTwo();
toolStripStatusLabel1.Text = "Task 2 done.";
toolStripStatusLabel1.Text = "Performing task 3...";
performTaskThree();
toolStripStatusLabel1.Text = "Task 3 done.";
}
private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
backgroundWorker2.ReportProgress(0, "Performing task 1...");
performTaskOne();
backgroundWorker2.ReportProgress(20, "Task 1 done.");
backgroundWorker2.ReportProgress(40, "Performing task 2...");
performTaskTwo();
backgroundWorker2.ReportProgress(60, "Task 2 done.");
backgroundWorker2.ReportProgress(80, "Performing task 3...");
performTaskThree();
backgroundWorker2.ReportProgress(100, "Task 3 done.");
}
private void backgroundWorker2_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
string status = (string)e.UserState;
toolStripStatusLabel1.Text = status;
}
private void performTaskThree()
{
Thread.Sleep(1000);
}
private void performTaskTwo()
{
Thread.Sleep(1000);
}
private void performTaskOne()
{
Thread.Sleep(1000);
}