我用vs2005做了一个Socket异步聊天程序。当客户端成功连接到服务器时,客户端要接受服务器发送过来的成功连接的信息。
   在客户端用 MessageBox.Show("与服务器" + clientSocket.RemoteEndPoint.ToString() + "相连接");能够显示信息,但用listBox1.Items.Add("与服务器"+clientSocket.RemoteEndPoint.ToString()+"相连接");就显示不了。
提示:线程间操作无效: 从不是创建控件“listBox1”的线程访问它。为了解决这个问题,我用委托的方法:public delegate IAsyncResult myDelegate();private void DelegateMothod()
{
    if (listBox1.InvokeRequired)
    {
        listBox1.Invoke(new myDelegate(ConnetionServer));
    }
}
private void ConnetionServer(IAsyncResult ar)
{
    clientSocket =(Socket)ar.AsyncState;
    try 
    {
        clientSocket.EndConnect(ar);        listBox1.Items.Add("与服务器"+clientSocket.RemoteEndPoint.ToString()+"相连接");       
       
        clientSocket.BeginReceive(data, 0, dataSize, SocketFlags.None, new AsyncCallback(ReceiveData), clientSocket);  
    }
    catch 
    {
        MessageBox.Show("与服务器连接失败!");
    }}
但是提示:错误 1 “ConnetionServer”的重载均与委托“Client.Form1.myDelegate”不匹配

把委托改成 void类型还是提示上面的错误。到底怎么回事呀?请帮我看看是什么原因吧,谢谢了先!(可能vs2003没用这个问题吧,但vs2005有)

解决方案 »

  1.   

    用委托,异步操作和窗体之间的控件不再一个线程内.
    delegate void ListboxCallback(string text);private void SetText(string text)
            {
                if (listBox1.InvokeRequired)
                {
                    ListboxCallback d = new ListboxCallback(SetText);
                    this.Invoke(d, new object[] { text });
                }
                else
                {
                    listBox1.Items.Add(text);
                }
            }
    试试吧
      

  2.   

    不行的。
    按照你的方法,我改成:
     private void DelegateMothod(IAsyncResult ar)
     {
         if (listBox1.InvokeRequired)
         {
             myDelegate d = new myDelegate(AcceptConnetion);
             listBox1.Invoke(d, new object[] { ar });
         }
         else
         {
             listBox1.Items.Add(ar);
         }
     }
    可运行到AcceptConnetion方法的
    listBox1.Items.Add("与客户" + clientSocket.RemoteEndPoint.ToString() + "建立连接");
    时候,还是提示:线程间操作无效: 从不是创建控件“listBox1”的线程访问它
      

  3.   

    对了,我的客户端是用socket.BeginConnect(serverTerminal, new AsyncCallback(ConnetionServer), socket);
    来连接服务器的,并没有用到Thread的实例呀。在哪里调用DelegateMothod方法呀?
      

  4.   

    异步回调的方法,,,
    首先你的listbox是在frm上直接添加的,其他线程操作通过委托是可以调用的没问题的,
    private void ConnetionServer(IAsyncResult ar)
    {
        clientSocket =(Socket)ar.AsyncState;
        try 
        {
            clientSocket.EndConnect(ar);        ///在这调用settext(str);  
           
            clientSocket.BeginReceive(data, 0, dataSize, SocketFlags.None, new AsyncCallback(ReceiveData), clientSocket);  
        }
        catch 
        {
            MessageBox.Show("与服务器连接失败!");
        }}
      

  5.   

    你也可以用事件,当接收到的时候触发该事件,在frm里面+=该事件.试试