我在服务器端建立一个线程,线程执行时,检测客户端到客户端有发来的信息就用label把它显示出来。
但是运行时提示“线程间操作无效: 从不是创建控件“lblInfomation”的线程访问它。”代码:
private void listenSocket()
{
IPAddress host = IPAddress.Parse("127.0.0.1");
listener = new TcpListener( host, 8000);
listener.Start();
TcpClient client = listener.AcceptTcpClient();
netstream = client.GetStream();
while (true)
{
byte[] bt = new byte[1024];
netstream.Read(bt, 0, bt.Length);
strinfo = System.Text.Encoding.Default.GetString(bt, 0, bt.Length);
this.lblInfomation.Text = strinfo;//就是这句话出错
}
}
private void btnStart_Click(object sender, EventArgs e)
{
serverThread = new Thread(new ThreadStart(listenSocket));
serverThread.Name = "first";
serverThread.Priority = ThreadPriority.Highest;
serverThread.Start();
}我把出错的那句话改为激活OnPaint事件:this.OnPaint(new PaintEventArgs(this.CreateGraphics(), new Rectangle(new Point(0, 0),this.Size)));,在这个事件的响应代码里执行this.lblInfomation.Text = strinfo,依旧是那个错误。
但是运行时提示“线程间操作无效: 从不是创建控件“lblInfomation”的线程访问它。”代码:
private void listenSocket()
{
IPAddress host = IPAddress.Parse("127.0.0.1");
listener = new TcpListener( host, 8000);
listener.Start();
TcpClient client = listener.AcceptTcpClient();
netstream = client.GetStream();
while (true)
{
byte[] bt = new byte[1024];
netstream.Read(bt, 0, bt.Length);
strinfo = System.Text.Encoding.Default.GetString(bt, 0, bt.Length);
this.lblInfomation.Text = strinfo;//就是这句话出错
}
}
private void btnStart_Click(object sender, EventArgs e)
{
serverThread = new Thread(new ThreadStart(listenSocket));
serverThread.Name = "first";
serverThread.Priority = ThreadPriority.Highest;
serverThread.Start();
}我把出错的那句话改为激活OnPaint事件:this.OnPaint(new PaintEventArgs(this.CreateGraphics(), new Rectangle(new Point(0, 0),this.Size)));,在这个事件的响应代码里执行this.lblInfomation.Text = strinfo,依旧是那个错误。
MainForm.CheckForIllegalCrossThreadCalls = Control.CheckForIllegalCrossThreadCalls = false;
{
if(this.lblInfomation.InvokeRequired)
{
SetLbText d = new SetLbText(SetLabelText);
this.Invoke(d,new object[]{text});
}
else
{
this.lblInfomation.Text = text;
}
}
//用这个方法,把那句换掉就OK了.