2012-01-07 191 views
0

有人能告訴我爲什麼下面的代碼不工作?線程不工作

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     Thread t = new Thread(rtb2); 
     t.Start(); 
    } 

    private void rtb2() 
    { 
     try 
     { 
      richTextBox1.Text = "1";     
     } 
     catch(InvalidOperationException ex) 
     { 
      MessageBox.Show("HI"); 
     }    
    } 
} 
+1

請定義「不工作」,但我敢打賭,這是因爲您沒有使用Control.Invoke來更新UI。 – ChrisF 2012-01-07 00:51:47

+1

JaredParand ChristF都是對的......但你真的應該更清楚「不工作」;) – paulsm4 2012-01-07 00:55:19

+0

FWIW對於短暫的線程,使用ThreadPool.QueueUserWorkItem來產生一個新的線程。 http://stackoverflow.com/questions/230003/thread-vs-threadpool – 2012-01-07 00:56:41

回答

6

問題是您試圖從後臺線程修改Winforms UI元素。這是WinForms模型特別不允許的。 UI元素只能從主線程修改。您需要使用Control.Invoke才能將上下文恢復到適當的線程。

private void rtb2() { 
    Action action = delegate { 
    richTextBox1.Text = "1"; 
    }; 

    try { 
    this.Invoke(action); 
    } catch(InvalidOperationException ex) { 
    MessageBox.Show("HI"); 
    } 
}