English 中文(简体)
取消Socket.xxxxAsync调用
原标题:
  • 时间:2009-02-19 01:31:21
  •  标签:

在调用 Socket.Shutdown、Socket.Close 和 Socket.Disconnect 之后,似乎 Socket.ReceiveAsync 不会中止。尝试重用用于 ReceiveAsync 调用的 SocketAsycEventArgs 对象(建议在文档中作为最佳实践)会导致错误:

一个异步套接字操作正在使用此SocketAsyncEventArgs实例中进行。

我该怎么做才能让ReceiveAsync释放对此SocketAsyncEventArgs实例的控制?

我已经通过标记挂起接收并在接收到到来之前不进行任何清理来解决这个问题(即已完成的调度)。虽然感觉不太好。它不能像WebRequest API一样被中止吗?

最佳回答

似乎没有一种方法可以中止异步接收。

当套接字关闭时,这将强制接收完成,并且 SocketAsyncEventArgs 参数的 SocketError 属性将具有值 SocketError.OperationAborted。当遇到此条件时,您可以将 SocketAsyncEventArgs 对象返回到可重用池中。

这在所示的示例中得到了演示。具体而言,请查看ProcessReceive()方法,该方法在 e.BytesTransferred == 0 e.SocketError!= SocketError.Success 时调用CloseClientSocket()方法。 CloseClientSocket()方法是其中SocketAsyncEventArgs对象返回到池中的位置。

问题回答

最有可能的原因是在重复使用 SocketAsyncEventArgs 时,您正在调用:

SAE.Completed += new EventHandler(SocketEventArg_Completed); SAE.Completed += new EventHandler(SocketEventArg_Completed);

这样做会导致回调函数被多次调用!!!

确保只设置一次“完成”处理程序。





相关问题