以下是我写的服务器端程序的一部分,可运行的时候在txtDisplay.Text &= vbCrLf & "Packet received:" & vbCrLf & "Length:" & data.Length & vbCrLf & "Containing: " & System.Text.Encoding.ASCII.GetString(data)处出现错误:从不是创建控件的线程访问。是怎么回事啊,请高手帮忙啊,万分感谢。(txtDisplay是textbox) 
Public Sub WaitForPackets()         While True             Dim data As Byte() = client.Receive(receivePoint) 
            MessageBox.Show(data(0).ToString)             txtDisplay.Text &= vbCrLf & "Packet received:" & vbCrLf & "Length:" & data.Length & vbCrLf & "Containing: " & System.Text.Encoding.ASCII.GetString(data)             txtDisplay.Text &= vbCrLf & vbCrLf & "Echo data back to Client..."             client.Send(data, data.Length, receivePoint) 
            txtDisplay.Text &= vbCrLf & "packet sent" & vbCrLf         End While     End Sub

解决方案 »

  1.   

    线程给txtDisplay.Text 主进程的界面控件赋值需要写委托方法,详细你搜下,csdn委托说得已经很多了
    当然也可以把Control.XXXX那个bool设置下也可以,不过不推荐,这种方法在你有多个访问界面控件的线程下会不稳定
      

  2.   

    你可以定义一个委托,使用this.Invoke来调用委托。
      

  3.   

    这跟c/s没有关系,就是c#的委托,
    跨线程访问控件可以参考一下下面代码public delegate void MyInvoke(string str); 
    private void button9_Click(object sender, EventArgs e) 

    //_myInvoke = new MyInvoke(SetText); 
    //CheckForIllegalCrossThreadCalls = false; 
    Thread t = new Thread(new ThreadStart(fun)); 
    t.Start(); 
    } private void fun() 

    //_myInvoke("dddd"); 
    SetText("ddd"); 

    private void SetText(string s) 

    if (textBox6.InvokeRequired) 

    MyInvoke _myInvoke = new MyInvoke(SetText); 
    this.Invoke(_myInvoke, new object[] { s }); 

    else 

    this.textBox6.Text = s; 

    }
      

  4.   

    .NET 2.0下默认是:不能垮线程,直接访问另一个线程的任何UI资源的,防止共享冲突,
    .NET 1.x能访问的好像。其实这是微软的一种引导,引导大家使用委托来访问UI资源,不要直接垮线程访问。所以.NET 2.0下,Control类提供了一个静态属性Control.CheckForIllegalCrossThreadCalls
    (是否允许交叉线程访问)来控制这个,通常情况下它是true,也就是不能垮线程访问如果搂主图简单,不想使用委托的话,可以把这个设置为false,也是可以的