我在服务器端执行到把接入的客户端显示到 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";
}这个问题我该怎么解决呢? 请高手指教
//异步套接字异步调用,接受并等待连接
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";
}这个问题我该怎么解决呢? 请高手指教
Control.CheckForIllegalCrossThreadCalls = false;
clientList.Invoke((EventHandler)delegate
{
clientList.Items.Add("客户" + clientKey);
});
1楼的代码意思是:允许跨线程使用控件。事实上,绝大多数情况下你都不需要理会这个所谓的限制。
{
if(clientList.InvokeRequired)
{
clientList.Invoke( (object obj)=> { func(obj)}, o );
}
else
clientList.Item.Add(o);
}