private void AsyncSend() { if (this.connected) { if (sendEventArgs.Buffer != null) sendEventArgs.SetBuffer(null, 0, 0); byte[] bytesMessage = new byte[1024];// m_socketHandler.PushSendBuffer(); Console.WriteLine("push成功"); i++; // sendEventArgs.SetBuffer(bytesMessage, 0, bytesMessage.Length); sendEventArgs.SetBuffer(Encoding.UTF8.GetBytes(i.ToString()), 0, Encoding.UTF8.GetBytes(i.ToString()).Length); sendEventArgs.UserToken = this.client; sendEventArgs.RemoteEndPoint = this.serverEndPoint; sendEventArgs.Completed += new EventHandler<SocketAsyncEventArgs>(sendEventArgs_Completed); client.SendAsync(sendEventArgs); } } private void sendEventArgs_Completed(object sender, SocketAsyncEventArgs e) { if (e.SocketError == SocketError.Success) { Console.WriteLine(Encoding.UTF8.GetString(e.Buffer)); Console.WriteLine("发送成功...."); if (e.LastOperation == SocketAsyncOperation.Send) { Console.WriteLine("继续发送数据..."); try { // Thread.Sleep(5000); AsyncSend(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } } }
上面的代码我想让程序重复发送数据给服务器端。
结果执行结果如下
我的疑问是为什么前两次发送是没有问题的,而第三次发送后,结果执行了两遍回调函数,而且更严重的是,如下:
这个对象已经被占用了。测试了好久,都是这个错误。
没有搞懂这个错误是什么原因导致的,请高手们赐教。
这问题的确存在,暂时解决办法是不用同一个SocketAsyncEventArgs,如果不想重复创建
SocketAsyncEventArgs可以用pool.
你的问题在于使用了同一个SocketAsyncEventArgs,你可以依照我的IoContextPool.cs写一个pool,在使用前从pool中取SocketAsyncEventArgs,响应sendEventArgs_Completed时,将SocketAsyncEventArgs归还给pool。