阅读Socket.AcceptAsync的MSDN文档我还不完全清楚是否有免费的“结束”方法。
因此,在BeginAccept()的情况下,有一个EndAccept()方法完成调用并将IAsyncResult作为参数,允许开发人员访问Socket(通过IAsyncResult.AsyncState方法)。在内部调用EndAccept(或任何其他Endxxx方法对)可以清除一些CLR分配的资源,并提供监视异步操作是否实际完成/错误等的功能。
所有这些都让我想到在调用AcceptAsync之后是否需要调用End方法 - 或者就此而言是ReceiveAsync?或者他们的End方法是否整齐地包含在Async中,可能是作为Task和ContinueWith?因此,为什么SocketAsyncEventArgs包含Socket本身。
如果有人知道那么辉煌!非常感谢!
答案 0 :(得分:1)
没有。没有End方法。
您应该处理Completed
中的SocketAsyncEventArgs
事件。另请注意,ReceiveAsync
等可以直接完成(因此不会触发事件)。
<强>更新强>
因此,为什么SocketAsyncEventArgs包含Socket本身。
这是因为您应该能够为同一个类中的所有客户端处理IO操作。您还有一个UserToken
属性,可用于存储客户特定信息。
或者他们的End方法整齐地包含在Async中,可能是作为Task和ContinueWith
没有。新的Async模型更像是由Windows提供的“真实”模型(IO完成端口)。引入了Begin / End类型的结构,使异步编程更容易。创建XxxxAsync模型是为了那些需要它的应用程序获得更好的性能(imho有一些可以从中受益,但它对那些非常重要)