【发布时间】:2013-06-10 08:07:16
【问题描述】:
我有一个简单的 Windows 窗体应用程序,它使用几个 BackgroundWorker 元素在后台执行操作。在开发过程中,我注意到我能够在 DoWork() 方法中执行诸如获取和设置 Label 的 .Text 值之类的操作,但无法获取 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);
}
【问题讨论】:
-
我也遇到了同样的情况,不得不使用代表......但我不知道为什么 +1
-
任何示例代码?我认为这里没有限制,
BackgroundWorker只是某种lightweight线程... -
BackgroundWorker旨在对 UI 友好,但它仍然是后台线程,这意味着您需要执行线程安全的操作,例如使用委托对 UI 控件进行操作。捷径经常会回来咬你......很难。 -
添加了一个代码示例来说明这两种方法
-
@invertigo 我测试了代码,
toolStripStatusLabel1.Text更新正常。你的实际问题是什么?一点也不例外?
标签: c# multithreading winforms backgroundworker ui-thread