以下是我写的服务器端程序的一部分,可运行的时候在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
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
当然也可以把Control.XXXX那个bool设置下也可以,不过不推荐,这种方法在你有多个访问界面控件的线程下会不稳定
跨线程访问控件可以参考一下下面代码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;
}
}
.NET 1.x能访问的好像。其实这是微软的一种引导,引导大家使用委托来访问UI资源,不要直接垮线程访问。所以.NET 2.0下,Control类提供了一个静态属性Control.CheckForIllegalCrossThreadCalls
(是否允许交叉线程访问)来控制这个,通常情况下它是true,也就是不能垮线程访问如果搂主图简单,不想使用委托的话,可以把这个设置为false,也是可以的