在调用Socket.Shutdown,Socket.Close和Socket.Disconnect之后,看来Socket.ReceiveAsync不会中止。尝试重用ReceiveAsync调用中使用的SocketAsycEventArgs对象(在文档中作为最佳实践建议)会导致错误:
使用此SocketAsyncEventArgs实例
正在进行异步套接字操作
如何让ReceiveAsync释放对此SocketAsyncEventArgs实例的控制,我该怎么做?
编辑:我通过标记待处理的接收并且在接收到来之前没有进行任何清理来解决这个问题(即已完成调度)。虽然感觉不太好。它不能像WebRequest API一样被中止吗?
答案 0 :(得分:7)
似乎没有办法中止异步接收。
当套接字关闭时,这会强制接收完成,并且回调方法的SocketAsyncEventArgs参数的SocketError属性将具有值SocketError.OperationAborted
。遇到这种情况时,可以将SocketAsyncEventArgs对象返回到可重用的池中。
在here显示的示例中对此进行了演示。具体来说,请查看ProcessReceive()方法,该方法在e.BytesTransferred == 0
或e.SocketError != SocketError.Success
时调用CloseClientSocket()方法。 CloseClientSocket()方法是将SocketAsyncEventArgs对象返回到池的位置。
答案 1 :(得分:0)
最有可能的原因是重用您正在调用的SocketAsyncEventArgs:
SAE.Completed + = new EventHandler(SocketEventArg_Completed);
这样做会导致您的回调被多次调用!!!
确保只设置一次已完成的处理程序。