2011-03-05 10 views
16

我的应用程序需要将消息快速广播到大量客户端(1000-s)并收集结果。.NET中的套接字在Begin *和* Async之间是否有任何性能差异?

我在想是否要使用的功能BeginSend/EndSend等家庭,或使用SendAsync家庭 - 有任何性能差异?除了不需要分配IAsyncResult的* Async系列之外,它们的区别是什么?

如果我理解正确,他们都使用IO完成端口和标准.net线程池......那么有什么区别?

回答

17

区别仅在于使用的模式。

SendAsync事实上使用的是Event-Based PatternBeginSendEndSend使用IAsyncResult pattern

编辑:我不知道IAsyncResult接口是如何在Socket类中实现,但这里是从MSDN一个document解释何时实现一个模式或另一个。从最后一部分

摘录:

而基于事件的异步模式具有 前面提到的情况下很多好处,它 确实有一些缺点,你 应该知道,如果性能 您最重要的要求。

有三种情况,该 基于事件的模式并没有解决 还有IAsyncResult的模式:

  1. 阻塞等待一个IAsyncResult的

  2. 许多IAsyncResult的阻塞等待对象

  3. 轮询完成IAsyncResult

您可以使用基于事件的模式通过 解决这些情况,但这样做比使用IAsyncResult模式使用 更麻烦。

开发人员经常使用IAsyncResult 模式,该模式通常对 具有非常高的性能 要求。例如,完成场景的轮询 是一个 高性能服务器技术。

此外,基于事件的模式 比 IAsyncResult的图案效率较低,因为它 创建多个对象,尤其是 EventArgs的,并且因为它实现了线程间 。

下面的列表显示跟随如果你 决定使用IAsyncResult的 模式有些 建议:

  • 只有暴露的IAsyncResult模式,当你特别要求WaitHandle对于 支持或IAsyncResult的 对象。

  • 只有在使用IAsyncResult模式的现有API 时才会公开IAsyncResult模式。

  • 如果您具有基于IAsyncResult的图案现有的API,考虑 也露出了基于事件的模式 在你的下一个版本。

  • 只有当你拥有高性能 要求您已经验证 不能由基于事件的 模式来满足,但是可以通过 IAsyncResult的模式来满足暴露的IAsyncResult模式。

+0

所以他们使用完全一样的底层机制,都完全一样的情况下阻止或上下文切换等的一样多吗?你能给一个参考吗? – jkff 2011-03-05 08:35:22

+0

他不能,他不知道谁高举他的答案。 – 2011-03-05 08:39:17

+0

@Hans:什么? @jkff:查看更新后的答案。 – 2011-03-05 08:58:21

相关问题