Socket从 .NET 3.5 开始就有这些新的异步方法,用于与 SocketAsyncEventArgs 一起使用(例如Socket.SendAsync()),好处在于它们使用 IO 完成端口并避免需要继续分配。
我们制作了一个名为UdpStream的类,它有一个简单的接口——只有StartSend和一个Completed事件。它分配了两个 SocketAsyncEventArgs,一个用于发送,一个用于接收。StartSend 只是使用 SendAsync 发送消息,每秒调用大约 10 次。我们在接收 SocketAsyncEventArgs 上使用 Completed 事件,并且在每个事件处理后我们都 ReceiveAsync 以便它形成一个接收循环。同样,我们每秒接收大约 10 次。
我们的系统需要支持多达500个这样的UdpStream对象。换句话说,我们的服务器将与 500 个不同的 IP 端点同时通信。
我注意到在 MSDN SocketAsyncEventArgs 示例中,它们分配了 N x SocketAsyncEventArgs,一个用于您想要一次处理的每个未完成的接收操作。我不清楚这与我们的场景有什么关系——在我看来,也许我们没有从 SocketAsyncEventArgs 中受益,因为我们只是为每个端点分配一个。如果我们最终收到 500 个接收 SocketAsyncEventArgs,我想我们不会得到任何好处。也许我们仍然可以从 IO 完成端口中获得一些好处?
当缩放到 500 时,此设计是否正确使用了 SocketAsyncEventArgs?
对于我们使用单个“UdpStream”的情况,使用 SocketAsyncEventArgs 与使用旧的 Begin/End API 相比有什么好处吗?