我的应用程序需要将消息快速广播到大量客户端(1000-s)并收集结果。.NET中的套接字在Begin *和* Async之间是否有任何性能差异?
我在想是否要使用的功能BeginSend/EndSend等家庭,或使用SendAsync家庭 - 有任何性能差异?除了不需要分配IAsyncResult的* Async系列之外,它们的区别是什么?
如果我理解正确,他们都使用IO完成端口和标准.net线程池......那么有什么区别?
我的应用程序需要将消息快速广播到大量客户端(1000-s)并收集结果。.NET中的套接字在Begin *和* Async之间是否有任何性能差异?
我在想是否要使用的功能BeginSend/EndSend等家庭,或使用SendAsync家庭 - 有任何性能差异?除了不需要分配IAsyncResult的* Async系列之外,它们的区别是什么?
如果我理解正确,他们都使用IO完成端口和标准.net线程池......那么有什么区别?
区别仅在于使用的模式。
SendAsync
事实上使用的是Event-Based Pattern。 BeginSend
和EndSend
使用IAsyncResult pattern。
编辑:我不知道IAsyncResult
接口是如何在Socket
类中实现,但这里是从MSDN一个document解释何时实现一个模式或另一个。从最后一部分
摘录:
而基于事件的异步模式具有 前面提到的情况下很多好处,它 确实有一些缺点,你 应该知道,如果性能 您最重要的要求。
有三种情况,该 基于事件的模式并没有解决 还有IAsyncResult的模式:
阻塞等待一个IAsyncResult的
许多IAsyncResult的阻塞等待对象
轮询完成IAsyncResult
您可以使用基于事件的模式通过 解决这些情况,但这样做比使用IAsyncResult模式使用 更麻烦。
开发人员经常使用IAsyncResult 模式,该模式通常对 具有非常高的性能 要求。例如,完成场景的轮询 是一个 高性能服务器技术。
此外,基于事件的模式 比 IAsyncResult的图案效率较低,因为它 创建多个对象,尤其是 EventArgs的,并且因为它实现了线程间 。
下面的列表显示跟随如果你 决定使用IAsyncResult的 模式有些 建议:
只有暴露的IAsyncResult模式,当你特别要求WaitHandle对于 支持或IAsyncResult的 对象。
只有在使用IAsyncResult模式的现有API 时才会公开IAsyncResult模式。
如果您具有基于IAsyncResult的图案现有的API,考虑 也露出了基于事件的模式 在你的下一个版本。
只有当你拥有高性能 要求您已经验证 不能由基于事件的 模式来满足,但是可以通过 IAsyncResult的模式来满足暴露的IAsyncResult模式。
所以他们使用完全一样的底层机制,都完全一样的情况下阻止或上下文切换等的一样多吗?你能给一个参考吗? – jkff 2011-03-05 08:35:22
他不能,他不知道谁高举他的答案。 – 2011-03-05 08:39:17
@Hans:什么? @jkff:查看更新后的答案。 – 2011-03-05 08:58:21