2012-01-07 52 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

「動作していません」と定義してくださいが、UIを更新するのに「Control.Invoke」を使用していないためだと思います。 – ChrisF

+1

JaredParand ChristFはどちらも正しいですが、実際には「作業していません」についてもっと明確になっていたはずです; – paulsm4

+0

FWIWは、短命のスレッドの場合は、新しいスレッドの生成にThreadPool.QueueUserWorkItemを使用します。 http://stackoverflow.com/questions/230003/thread-vs-threadpool –

答えて

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"); 
    } 
} 
関連する問題