一个异步聊天时,客户端接受服务器发送过来的的信息的显示问题……
我用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里面+=该事件.试试