【问题标题】:.NET 4.5 Async vs. TPL.NET 4.5 异步与 TPL
【发布时间】:2016-06-21 19:29:13
【问题描述】:

我开始阅读有关 .NET 4.5 Async 的信息,但坦率地说,在谈到使用模式时,我还不能充分利用它。所以我会尝试用一个直接的问题来解决这个问题:

我通常使用 .NET 4 TPL 从我的 ASP.NET 应用程序内部调用昂贵的 Web 服务和 DB 调用。似乎我可以用异步实现同样的事情。这是真的?什么时候用哪个?

提前致谢。

【问题讨论】:

    标签: .net asynchronous task-parallel-library


    【解决方案1】:

    TPL 是一个用于并行计算的库。 .NET 4.5 async 是一种语言功能,建立在 TPL 之上,可简化流程。当您的工作流程包含多个步骤时尤其如此。

    简而言之,async 让您可以像编写同步代码一样编写代码,因此逻辑流程保持不变。等待任务完成的过程,在发生这种情况时运行特定代码,可以使用async 以非常自然的方式完成。 C# 5.0 和 VB 11.0 编译器使用 TPL 和一些新的async 相关类型将您的代码转换为等效的 C# 4.0 和 VB 10.0 代码。

    有关 async 的出色底层解释,请参阅 Jon Skeet 的 Eduasync 博客系列。

    那么,您如何决定使用哪个?好吧,async 基本上抽象出了创建与异步调用链接在一起的代码片段序列的所有复杂性。大概当您调用 Web 服务或访问数据库时,您想要对返回的内容做一些事情。 async 允许您将调用和处理代码放在一起,这将使您的代码更易于编写,也更易于以后阅读。

    【讨论】:

    • 感谢 jeffrey 的回复,但仍然无法确定何时使用 which..say,例如在 Web 服务调用示例中。
    • 使用异步。如果您发现无法使用异步完成的内容,请继续使用 TPL。如果那不清楚。应该选择这个作为答案,因为它是一个清晰简洁的解释。
    【解决方案2】:

    @Pawan 关于 BeginXXX/EndXXX:我认为你把事情搞混了。 查看 C#,有 3 种不同的 patterns 运行并行代码:

    • 已弃用:异步编程模型 (APM)
    • 已弃用:基于事件的异步模式 (EAP)
    • 最新:基于任务的异步模式 (TAP)

    TPL 是构建 TAP 的基础。 TPL 是在 .NET 4 中引入的。尽管 TPL 和 TAP 在 Microsoft 文档中以某种方式同等使用。无论哪种方式,async/await 都只是 C# 5 引入的一种语言功能,即 .NET 4.5,以简化的方式提供对 TPL 的支持。

    The BeginXXX/EndXXX belongs to the APM style! 所以跟TPL没有任何关系。这些多个版本使保持概览变得困难。

    【讨论】:

      【解决方案3】:

      我的猜测是 .Net TPL 和异步在内部都使用线程池线程。异步可能是传统 BeginXXX/EndXXX 模式的简化语法。

      但更重要的是 TPL 使用线程池线程,您不应该将它用于执行昂贵的操作,因为框架本身使用相同的线程。如果您正在进行昂贵的操作(正如您所提到的),那么最好在使用 TPL 时创建一个新的独立线程或将 ThreadSchedular 的“LongRunning”属性设置为。

      【讨论】:

      • 昂贵的 I/O != 昂贵的 CPU
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      • 2015-04-30
      • 1970-01-01
      • 2015-02-28
      • 2014-12-09
      相关资源
      最近更新 更多