.NET中的套接字的Begin *和* Async之间是否有任何性能差异?

时间:2011-03-05 08:22:48

标签: .net sockets asynchronous

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

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

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

1 个答案:

答案 0 :(得分:17)

区别仅在于使用的模式。

事实上

SendAsync使用Event-Based PatternBeginSendEndSend使用IAsyncResult pattern

编辑:我不知道IAsyncResult类中Socket接口是如何实现的,但这里是来自MSDN的document,它解释了何时实施一种模式或另一种模式。

摘自上一部分:

  

虽然基于事件的异步模式有很多好处   它前面提到过的场景   确实有一些缺点,你   应该知道性能是否   你最重要的要求。

     

有三种情况   基于事件的模式无法解决   以及IAsyncResult模式:

     
      
  1. 阻止等待一个IAsyncResult

  2.   
  3. 阻止等待许多IAsyncResult对象

  4.   
  5. 轮询完成IAsyncResult

  6.         

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

         

    开发人员经常使用IAsyncResult   通常的服务模式   有很高的性能   要求。例如,民意调查   完成方案是一个   高性能服务器技术。

         

    此外,基于事件的模式   效率低于   IAsyncResult模式因为它   特别是创造了更多的物体   EventArgs,因为它同步   跨线程。

         

    以下列表显示了一些内容   建议您遵循   决定使用IAsyncResult   图案:

         
        
    • 仅在您特别需要时才公开IAsyncResult模式   支持WaitHandle或IAsyncResult   对象

    •   
    • 仅在具有现有API时公开IAsyncResult模式   使用IAsyncResult模式。

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

    •   
    • 如果您具有高性能,则仅公开IAsyncResult模式   您已验证的要求   基于事件的不能满足   模式,但可以满足   IAsyncResult模式。

    •