我在服务器端建立一个线程,线程执行时,检测客户端到客户端有发来的信息就用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,依旧是那个错误。

解决方案 »

  1.   

    从后台线程访问界面控件默认是不允许的要设置一个值才行。
    MainForm.CheckForIllegalCrossThreadCalls = Control.CheckForIllegalCrossThreadCalls = false;
      

  2.   

    delegate void SetLbText(string text);void  SetLabelText(string text)
    {
        if(this.lblInfomation.InvokeRequired)
        {
            SetLbText d = new SetLbText(SetLabelText);
            this.Invoke(d,new object[]{text});
        }
        else
        {
           this.lblInfomation.Text = text;
        }
    }
    //用这个方法,把那句换掉就OK了.