Form1窗体 通过线程发送一个消息到   Form2窗体但是到B窗体接收的时候告诉我:
线程间操作无效: 从不是创建控件“textBox1”的线程访问它。
我如何解决这个线程同步的问题!Form1的代码
Form2 f2;
private void Form1_Load(object sender, EventArgs e)
{
     f2 = new Form2();
     f2.Show();
}
private void button1_Click(object sender, EventArgs e)
{
     new Thread(new ThreadStart(ConnectServer)).Start();
}private void ConnectServer()
{
     f2.InputString(this.textBox1.Text.Trim());
}Form2的代码:
public void InputString(string Msg)
{
     this.textBox1.Text = Msg;  //这里报错!
}请问各位师哥解决这个方法有几种方法!最好能代码明示愚钝菜鸟小妹!

解决方案 »

  1.   

     textBox1.Invoke(tt, new object[] {s });
     发表于:2008-04-18 14:33:32 楼主 
    Form1窗体 通过线程发送一个消息到   Form2窗体 但是到B窗体接收的时候告诉我: 
    线程间操作无效: 从不是创建控件“textBox1”的线程访问它。 
    我如何解决这个线程同步的问题! Form1的代码 
    Form2 f2; 
    private void Form1_Load(object sender, EventArgs e) 

         f2 = new Form2(); 
         f2.Show(); 

    private void button1_Click(object sender, EventArgs e) 

         new Thread(new ThreadStart(ConnectServer)).Start(); 
    } private void ConnectServer() 

         f2.InputString(this.textBox1.Text.Trim()); 
    } Form2的代码: 
    public delegate void setText(string Msg);
    public setText tt;
    public void InputString(string Msg) 

          tt = new setText(SetTextValue);
                textBox1.Invoke(tt, new object[] {Msg });
    }  
    public void SetTextValue(string Msg) 

         this.textBox1.Text=Msg;
    }  
     
      

  2.   

     从不是创建控件“textBox1”的线程访问它。 
    ----------------
    线程访问控件要用委托的,具体可参见愚翁的BOLG,里面有详细的介绍
      

  3.   

    能不用这种方法访问吗?
    textBox1.Invoke(tt, new object[] {s }); 
    和public delegate void setText(string Msg); 
    这两种方法!这个还是通过线程访问!我想直接在Form2里!直接这样访问!public void InputString(string Msg) 

         this.textBox1.Text = Msg;  //这里报错! 
    } 在Form1里能改进吗?
      

  4.   

    invoke或者把这句CheckForIllegalCrossThreadCalls = false;加到f2.inputstring 前面
      

  5.   

    9楼师哥!我照你的方法确实改成功了!多谢!但是我把代码改进了一下!从Form1向Form2线程发送消息成功!然后我在从Form2向Form1线程发送消息,接收成功了!但是不显示这是为什么!您帮我看一下代码!Form1代码:
    Form2 f2;
    private void button1_Click(object sender, EventArgs e)
    {
        new Thread(new ThreadStart(ConnectServer)).Start();
    }private void ConnectServer()
    {
         CheckForIllegalCrossThreadCalls = false;
         f2.InputString(this.textBox1.Text.Trim());
    }
    public void InputString(string Msg)
    {
         this.textBox1.Text = Msg; //返回时Msg能收到消息,但是不能显示在控件上
    }private void Form1_Load(object sender, EventArgs e)
    {
         f2 = new Form2();
         f2.Show();
    }Form2代码:
    Form1 f1;
    public void InputString(string Msg)
    {
          this.textBox1.Text = Msg;
          Thread readerthread=new Thread(new ThreadStart(ReadThread));
          readerthread.Start();
    }private void ReadThread()
    {
         CheckForIllegalCrossThreadCalls = false;
         f1.InputString("发送成功!!!!!!!!!");
    }
    private void Form2_Load(object sender, EventArgs e)
    {
         f1 = new Form1();
    }this.textBox1.Text = Msg; //返回时Msg能收到消息,但是不能显示在控件上
      

  6.   

    msdn中有写啊,线程安全的问题,要用到委托技术,给你一个网址看参考一下吧
      

  7.   

    http://msdn2.microsoft.com/zh-cn/library/ms171728(VS.80).aspx
    看完你就知道了