jkf*_*kff 18 .net sockets asynchronous
我的应用程序需要快速向大量客户端(1000-s)广播消息并收集结果.
我在考虑是否使用BeginSend/EndSend等系列函数,或者使用SendAsync系列 - 是否有任何性能差异?它们的区别是什么,除了*Async系列不需要分配IAsyncResult?
如果我理解正确,他们都使用IO完成端口和标准.net线程池...那么有什么区别?
as-*_*cii 19
区别仅在于使用的模式.
SendAsync实际上使用基于事件的模式.BeginSend并EndSend使用IAsyncResult模式.
编辑:我不知道IAsyncResult接口是如何在Socket类中实现的,但这里是来自MSDN 的文档,它解释了何时实现一个模式或另一个模式.
摘自上一部分:
虽然基于事件的异步模式在前面提到的场景下有许多好处,但它确实有一些缺点,如果性能是您最重要的要求,您应该注意这些缺点.
基于事件的模式无法解决三种情况以及IAsyncResult模式:
阻止等待一个IAsyncResult
阻止许多IAsyncResult对象的等待
轮询完成IAsyncResult
您可以使用基于事件的模式来解决这些问题,但这样做比使用IAsyncResult模式更麻烦.
开发人员经常将IAsyncResult模式用于通常具有非常高性能要求的服务.例如,轮询完成方案是一种高性能服务器技术.
此外,基于事件的模式效率低于IAsyncResult模式,因为它创建了更多对象,尤其是EventArgs,并且因为它跨线程同步.
以下列表显示了在您决定使用IAsyncResult模式时要遵循的一些建议:
仅在特别需要对WaitHandle或IAsyncResult对象的支持时才公开IAsyncResult模式.
当您拥有使用IAsyncResult模式的现有API时,仅公开IAsyncResult模式.
如果您有基于IAsyncResult模式的现有API,请考虑在下一版本中公开基于事件的模式.
如果您已经验证的高性能要求无法通过基于事件的模式满足但只能通过IAsyncResult模式满足,则仅公开IAsyncResult模式.