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