从非UI线程更新Windows窗体上的标签?

时间:2014-01-05 19:20:03

标签: c# multithreading winforms forms

我已经尝试了2天才能做到这一点。我已经查看了大量的stackoverflow答案并尝试了所有这些答案,我仍然遇到同样的问题。

我在Windows窗体上有一个标签。此窗体上唯一的代码是:

var thread1 = new Thread(new ThreadStart(Censored.Signup));
thread1.Start();

现在,在Windows窗体上我也有一个标签。它的名字是“createdLabel”

在一分钟前我谈过的thread1(Censored.Signup)中,我有以下代码(与其他代码实际构成程序,无关):

int created = 0;
for (int i = 0; i < 10; i++)
{

   created++;
   createdLabel.Text = (string.Format("Created: [{0}]", created));
}

我想要的是使用工作线程(Censored.Signup)中的信息(已创建)更新标签(在表单上创建的标签)。

例如

(“&gt;”表示接下来/之后发生的事情):
label1 = 0&gt; Censored.Signup中的循环遍历并更新表单上的标签&gt; label1 = 1

我试图将其作为“像我5岁的解释”尽可能地尝试并且非常清楚,但是如果有人感到困惑并且需要清理任何东西,请告诉我。任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:4)

标签的内容只能从UI线程更改。使用Invoke方法在具有正确文本的UI线程上执行回调

string text = string.Format("Created: [{0}]", created);
createdLabel.Invoke((Action)delegate { createdLabel.Text = text; });