2010-01-31 51 views
10

我需要帮助,设置/更改我的C#程序中的标签的值,每当我尝试时发生错误,说我需要跨线程一切。任何人都可以写一些代码来帮助我吗? 我的代码是:用C#跨线程设置标签值

int number = 0; 
int repeats = Convert.ToInt32(textBox2.Text); 

while (number < repeats) 
{ 
    repeats++; 
    label5.Text = "Requested" + repeats + "Times"; 
} 

任何人都可以帮助我吗? 谢谢。

+0

我假设你的意思是你正在得到一个异常,因为你试图从另一个线程设置标签Text属性? – zebrabox 2010-01-31 16:51:58

+0

是啊:(现在已经很好排序了。 – Lawrence 2010-02-02 21:43:41

回答

30

尝试使用以下来更新值

label5.Invoke((MethodInvoker)(() => label5.Text = "Requested" + repeats + "Times")); 

Invoke方法(从Control.Invoke)将导致在代表传递给被所述给定Control被关联到该线程上运行。在这种情况下,它会导致它在您的应用程序的GUI线程上运行,从而使安全更新。本机在你的代码通过

/// <summary> 
    /// Extension method that allows for automatic anonymous method invocation. 
    /// </summary> 
    public static void Invoke(this Control c, MethodInvoker mi) 
    { 
    c.Invoke(mi); 

    return; 
    } 

然后,您可以在任何控制使用(或其衍生物):

+0

非常感谢:)工作过! – Lawrence 2010-01-31 17:00:39

9

可以补充一点,我经常使用(在技术类似于@ JaredPar的答案)这个扩展方法

// "this" is any control (commonly the form itself in my apps) 
this.Invoke(() => label.Text = "Some Text"); 

你也可以执行通过匿名方式通过多种方法:

this.Invoke 
(
    () => 
    { 
     // all processed in a single call to the UI thread 
     label.Text = "Some Text"; 
     progressBar.Value = 5; 
    } 
); 

请记住,如果您的线程正试图对已处理的控件进行调用,您将得到ObjectExposedException。如果线程尚未由应用程序关闭,则会发生这种情况。你可以通过围绕你的Invoke()调用来“吃”ObjectDisposedException,或者你可以在Invoke()方法扩展中“吃”这个异常。