我有一个简单的 Windows 窗体应用程序,它使用几个BackgroundWorker元素在后台执行操作。在开发过程中,我注意到我能够在方法中执行诸如获取和设置.Text
Label 的值之类的DoWork()
操作,但无法获取 DrowDownList 的值。
我的印象是 BackgroundWorker 不应该有任何 UI 交互,这条规则有一些例外吗?
我不是在寻找从 BackgroundWorker 更新 UI 的建议,我更好奇是否有可以采用的快捷方式,例如直接从 BackgroundWorker 更新 ToolStripStatusLabel 的文本。
这是一个简单的示例,worker 1 直接更新 UI,而 worker 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);
}