日期:2014-05-19  浏览次数:20934 次

一个异步聊天时,客户端接受服务器发送过来的的信息的显示问题……
我用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有)



------解决方案--------------------
用委托,异步操作和窗体之间的控件不再一个线程内.
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);
}
}
试试吧
------解决方案--------------------
异步回调的方法,,,
首先你的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( "与服务器连接失败! ");
}

}

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