在.NET中,BEGIN*和*异步套接字之间有性能差异吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (9)

我的应用需要迅速向大量客户(1000-s)广播消息并收集结果。

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

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

提问于
用户回答回答于

区别仅在于使用的模式。

SendAsync事实上使用基于事件的模式BeginSendEndSend使用IAsyncResult模式

我不知道如何IAsyncResultSocket类中实现接口,但这里是来自MSDN 的文档,说明何时实现一个模式或另一个模式。

摘自最后一部分:

虽然基于事件的异步模式在前面提到的场景下有很多好处,但它有一些缺点,如果性能是您最重要的要求,您应该知道这些缺点。 有三种基于事件的模式无法解决的情况以及IAsyncResult模式:

  1. 阻止等待一个IAsyncResult
  2. 阻止等待许多IAsyncResult对象
  3. 轮询完成IAsyncResult

可以使用基于事件的模式来解决这些情况,但这样做比使用IAsyncResult模式更麻烦。 开发人员经常使用IAsyncResult模式来处理通常具有非常高性能要求的服务。例如,轮询完成场景是一种高性能的服务器技术。 此外,基于事件的模式效率低于IAsyncResult模式,因为它创建了更多的对象,特别是EventArgs,并且因为它跨线程同步。 如果决定使用IAsyncResult模式,以下列表显示了一些建议:

  • 当特别要求支持WaitHandle或IAsyncResult对象时,仅公开IAsyncResult模式。
  • 只有当拥有使用IAsyncResult模式的现有API时才会公开IAsyncResult模式。
  • 如果有基于IAsyncResult模式的现有API,请考虑在下一个版本中公开基于事件的模式。
  • 如果已验证的高性能需求无法通过基于事件的模式满足,但可以通过IAsyncResult模式满足,则只需公开IAsyncResult模式。

扫码关注云+社区