比如下面代码,为什么子线程中,很多语句没办法执行,而放在主线程里就可以正常执行。为什么不行,要如何才可以~~~我创建多线程是因为我用了hread.Sleep(5000)延时,如果不在别的线程中运行,界面就是卡死。 private void button1_Click(object sender, EventArgs e)
        {            Thread thread = new Thread(new ThreadStart(WriteData));
            thread.Start();         }
        protected void WriteData() 
        {
            webBrowser1.Navigate(new Uri("http://wb.renren.com")); //这句可以执行
            Thread.Sleep(5000); //延时
            textbox1.text="1111";  //这句无法执行
            webBrowser1.Document.All["query"].InnerText = "ABC"; //无法执行
        }

解决方案 »

  1.   

    线程间的控件访问问题,建议楼主参考下MSDN中的线程间的控件访问。
      

  2.   

    因为窗体控件不是线程安全的
    所以为了安全framework会禁止修改其他线程创建的控件
    如果需要改动,必须实现线程安全
    2种方法
    1.在BackgroundWorker线程中修改控件
    2.用这种方式修改 delegate void SetTextCallback(string text);
    private void SetText(string text)
    {
    if (this.textBox1.InvokeRequired)
    {
    SetTextCallback d = new SetTextCallback(SetText);
    this.Invoke(d, new object[] { text });
    }
    else
    {
    this.textBox1.Text = text;
    }
    }
      

  3.   

    默认情况下,C#不允许在一个线程中直接操作另一个线程中(创建)的控件,这是因为访问Windows窗体控件不是线程安全的。如果创建控件的线程之外的其他线程试图调用该控件,则会引发InvalidOperateException异常,并提示消息“从不是创建控件的线程访问它”。解决方法一,如楼上所示
    解决方法二:
    取消控件的跨线程检测
    在窗体的load函数中加入如下代码:
    System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls=false;
      

  4.   

      由于textbox,和webBrowser是主线程上创建的控件,所以存在跨线程问题,只要修改writeData,使用invoke就可以解决
          protected void WriteData()
            {
                webBrowser1.Navigate(new Uri("http://wb.renren.com")); //这句可以执行
                System.Threading.Thread.Sleep(5000); //延时            Action d1 = delegate()
                {
                    textbox1.Text = "1111"; //这句无法执行
                };
                textbox1.Invoke(d1);            Action d2 = delegate()
                {
                    webBrowser1.Document.All["query"].InnerText = "ABC"; //无法执行            
                };
                webBrowser1.Invoke(d2);
            }
      

  5.   

    委托invork还有个什么属性需要判断的。最好查阅MSDN