我发现了Difference between […]Async and Begin[…] .net asynchronous APIs问题,但this answer使我有些困惑。
在谈到这些模式时,斯蒂芬说:

我知道,因为使用* Async方法更有效,至少在套接字方面更有效。
但随后他提到了任务并行库:

我在MSDN上找到了TPL and Traditional .NET Asynchronous Programming,我知道TPL的基础知识,创建任务,取消,继续等,但是我仍然无法理解这些内容:
与之相比,异步编程模型(APM)和基于事件的异步模式(EAP)有什么优势? TPL如何轻松包装APM 意味着APM和EAP都被 TPL取代了
最重要的是:我应该在套接字编程中使用哪一个;

  • APM?
  • EAP?
  • 由任务包装的APM或EAP?
  • 通过在任务中使用Socket类的阻塞方法来实现TPL?
  • 其他吗?
  • 最佳答案



    没有。是否将APM和EAP替换为TAP(任务异步模式),或者在新的API中与此无关。出于各种原因,我希望TAP取代APM和EAP。对我来说,主要原因是您为使用TAP编写的代码组成的更好。通常,执行.ContinueWith(/* ... */).ContinueWith(/* ... */)的读取效果比通过Begin/End方法编写链式异步调用所需的相应代码要好得多,即使您不考虑可以传递给ContinueWith来确定是否应该继续运行的选项。 TPL还为Task提供了各种组合器,例如WaitAllWaitAny,可以使某些情况变得更加容易。通过async/await关键字在C#和VB.NET中提供的语言支持将使此操作变得更加容易。

    能够在TAP中包装APM使得切换到此模式变得更加容易,因为这意味着您不必重写现有代码即可使其适合新模型。



    我建议使用TAP将APM方法包装在Socket上。除非您能证明将Begin/End方法包装到Task中的额外开销是可伸缩性/是否足够快之间的区别,否则我将利用TAP编码的简便性。

    10-06 15:50