我在服务器端执行到把接入的客户端显示到 clientList.Items.Add("客户" + clientKey);中提示错误“线程间操作无效: 从不是创建控件“clientList”的线程访问它”
//异步套接字异步调用,接受并等待连接
        public void OnClientConnect(IAsyncResult asyn)
        {
            try
            {                // 调用EndAccept完成BeginAccept异步调用,返回一个新的Socket处理与客户的通信
                Socket workerSocket = mainSocket.EndAccept(asyn);
                // 增加客户数目
                Interlocked.Increment(ref clientNum);
                // 将 workerSocket Socket加入到 ArrayList 中
                workerSocketList.Add(workerSocket);
                // 发送欢迎信息给连接上服务器的客户
                string msg = "欢迎客户 " + clientNum + " 登录服务器\n";
                Net.SendData(workerSocket, msg, 1000);
                ClientList(clientNum);
                //z转向数据接收模块
                recvDataFromCient(workerSocket, clientNum);
                // 主 Socket 返回,继续等待其它的连接请求
                mainSocket.BeginAccept(new AsyncCallback(OnClientConnect), null);
            }
            catch (ObjectDisposedException)
            {
                System.Diagnostics.Debugger.Log(0, "1", "\n OnClientConnection: Socket已经关闭!\n");
            }
            catch (SocketException se)
            {
                MessageBox.Show(se.Message, "提示");
            }
        }
         ///<summary>
         ///设置客户列表
         ///</summary>
         ///<param name="clientKey">客户号</param>
        void ClientList(int clientKey)
        {
            clientList.Items.Add("客户" + clientKey);
            txtRecvMsg.Text += "[" + DateTime.Now.ToShortTimeString() + "]客户" + clientKey.ToString() +
                "登陆服务器!\r\n";
        }这个问题我该怎么解决呢? 请高手指教

解决方案 »

  1.   

    程序开始执行以下这个试试
    Control.CheckForIllegalCrossThreadCalls = false;
      

  2.   

    参见:Control.InvokeRequired 属性 获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中。
      

  3.   

    clientList.Items.Add("客户" + clientKey);改为
    clientList.Invoke((EventHandler)delegate
    {
    clientList.Items.Add("客户" + clientKey);
    });
      

  4.   

    是多线程的关系 你在要赋值的时候 调用一个event  event方法中赋值就可以了
      

  5.   

    1 楼已经解决你的问题了,还在这里问......我再多说2句吧:从.net2.0开始,考虑到多线程的安全性,.net默认不允许跨线程使用控件。
    1楼的代码意思是:允许跨线程使用控件。事实上,绝大多数情况下你都不需要理会这个所谓的限制。
      

  6.   

    clientList.Items.Add这句替换成一个funcfunc(object o)

    if(clientList.InvokeRequired)
    {
       clientList.Invoke( (object obj)=> { func(obj)}, o );
    }
    else
    clientList.Item.Add(o);