我用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有)
在客户端用 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);
}
}
试试吧
按照你的方法,我改成:
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”的线程访问它
来连接服务器的,并没有用到Thread的实例呀。在哪里调用DelegateMothod方法呀?
首先你的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("与服务器连接失败!");
}}