2010-01-31 101 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()方法擴展中「吃」這個異常。