2012-10-31 41 views
0

所以我有3個標籤,必須使用一個隨機數同時更新它們全部三個,直到用戶單擊停止它的按鈕。C#中的多線程 - 更新標籤

這是我對我的啓動按鈕

private void start_Click(object sender, EventArgs e) 
{ 
     t1 = new Thread(new ThreadStart(FirstNumber)); 
     t2 = new Thread(new ThreadStart(SecondNumber)); 
     t3 = new Thread(new ThreadStart(ThirdNumber)); 

     t1.Start(); 
     t2.Start(); 
     t3.Start(); 
} 

這是什麼,產生的隨機數的方法看起來像

public void FirstNumber() 
{ 
     int j = r.Next(0, 50); 
     int k = r.Next(50, 100); 
     for (int i = j; i <= k; i++) 
     { 
      number1.Text = i.ToString(); 
      Thread.Sleep(200); 
     } 
} 

當我調試,我得到以下錯誤:

Cross-thread operation not valid: Control 'number2' accessed from a thread other than the thread it was created on.

我不明白我是如何爲每個線程創建控件,所以任何幫助非常感謝。

還有一件事,用戶能夠在標籤更新時點擊停止按鈕嗎?還是需要添加另一個等待用戶輸入的線程?

非常感謝!

回答

5

您只需要在UI線程,而不是其他線程設置文本框的值,這樣你就可以使用Control.InvokeControl.BeginInvoke對UI線程中執行委託:

number1.BeginInvoke(new Action(() => { number1.Text = i.ToString(); })); 
+0

現在工作很好,感謝您的快速答覆! – rememberthecant

1

您只能在UI線程上訪問UI。您可以通過Dispatcher.BeginInvoke()方法將內容發佈到UI線程。

0

對於.NET線程之間的同步通信的SynchronizationContext

// gui thread 
var syncContext = System.Threading.SynchronizationContext.Current; 

public void FirstNumber() 
{ 
     int j = r.Next(0, 50); 
     int k = r.Next(50, 100); 
     for (int i = j; i <= k; i++) 
     { 
      // Post or Send mth 
      syncContext.Post((o) => 
      { 
      number1.Text = i.ToString(); 
      }); 

      Thread.Sleep(200); 
     } 
}