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