我在我的Winform中使用后台工作线程,在我的Do_Work事件中我正在计算一些东西,我需要的是同时我想更新一个标签,它是在主/ UI线程?如何实现这一目标?在运行后台UI中更新控件Winforms中的线程
我想更新从Do_Work事件我的标签......
我在我的Winform中使用后台工作线程,在我的Do_Work事件中我正在计算一些东西,我需要的是同时我想更新一个标签,它是在主/ UI线程?如何实现这一目标?在运行后台UI中更新控件Winforms中的线程
我想更新从Do_Work事件我的标签......
里面你Do_Work
方法,你可以使用对象的Invoke()
方法,其UI线程执行的委托,如:
this.Invoke(new Action<string>(UpdateLabel), newValue);
...然后确保这样的方法添加到您的类:
private void UpdateLabel(string value)
{
this.lblMyLabel.Text = value;
}
我希望这帮助:
int x = 0;
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
label1.Text = x.ToString();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
x++;
//you can put any value
backgroundWorker1.ReportProgress(0);
}
private void button6_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
对不起,但这段代码真的没有什么帮助,即使这段代码给出了一个异常 - “backgroundWorker1.ReportProgress(0);” – user1444231
你是否设置了WorkerReportsProgress为true?如果你这样做,请给我例外消息 –
在WinForms(也是WPF)中,UI控件只能在UI线程中更新。您应该更新您的标签是这样的:
public void UpdateLabel(String text){
if (label.InvokeRequired)
{
label.Invoke(new Action<string>(UpdateLabel), text);
return;
}
label.Text = text;
}
您是用户界面(标签)更新过程中面临着跨线程异常的问题,因为它(UI)是在不同的线程(mainThread)。您可以与许多走像TPL,线程池,等等等等,但简单的方式选择,做你想要的是写在你的Do_Work方法简单的动作如
私人无效backgroundWorker1_DoWork(对象发件人,DoWorkEventArgs E)
{
x++;
//you can put any value
Action = act =()=>
{
label.Text = Convert.ToString(x);
};
if (label.InvokeRequired)
label.BeginInvoke(act);
else
label.Invoke(act);
backgroundWorker1.ReportProgress(0);
}
见ReportProgress方法和ProgressChanged事件。你可以传递一个字符串作为用户数据。 –