C# 线程不工作

C# 线程不工作,c#,.net,c#-4.0,C#,.net,C# 4.0,有人能告诉我为什么下面的代码不起作用吗 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Thread t = new Thread(rtb2); t.Start(); } pr

有人能告诉我为什么下面的代码不起作用吗

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");
        }            
    }
}

问题是您试图从后台线程修改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");
  }
}

问题是您试图从后台线程修改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");
  }
}

请定义“不工作”,但我敢打赌这是因为您没有使用
控件。调用
来更新UI。JaredParan和ChristF都是正确的。。。但你真的应该更清楚“不工作”;)FWIW,对于短命线程,使用ThreadPool.QueueUserWorkItem来生成新线程。因为您知道正在抛出异常,所以可以从异常本身找到问题所在:MessageBox.Show(“HI”+ex.ToString());请定义“不工作”,但我敢打赌这是因为您没有使用
控件。调用
来更新UI。JaredParan和ChristF都是正确的。。。但你真的应该更清楚“不工作”;)FWIW,对于短命线程,使用ThreadPool.QueueUserWorkItem来生成新线程。因为您知道正在抛出异常,所以可以从异常本身找到问题所在:MessageBox.Show(“HI”+ex.ToString());