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