使用Winforms中的运行后台线程更新UI中的控件

我在Winform中使用Background Worker Thread,在我的Do_Work事件中我正在计算一些东西,我需要的是同时我想更新一个在main / UI线程中的标签? 怎么实现这个?

我想从Do_Work事件中更新我的标签……

在WinForms(WPF)中,UI控件只能在UI线程中更新。 你应该这样更新你的标签:

public void UpdateLabel(String text){ if (label.InvokeRequired) { label.Invoke(new Action(UpdateLabel), text); return; } label.Text = text; } 

Do_Work方法中,您可以使用对象的Invoke()方法在其UI线程上执行委托,例如:

 this.Invoke(new Action(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(); } 

在用户界面(标签)更新期间,您遇到了跨线程exception的问题,因为它(UI)位于不同的线程(mainThread)中。您可以使用许多选项,如TPL,ThreadPool,等等但是简单的方法来做你的事情想要在你的Do_Work方法中写一个简单的Action作为

private void backgroundWorker1_DoWork(object sender,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); }