.NET 4.5异步与TPL

时间:2011-11-17 14:28:04

标签: .net asynchronous task-parallel-library

我开始阅读有关.NET 4.5 Async的内容,但坦率地说,当涉及到使用模式时,它还无法充分利用它。所以我会尝试直接提出问题:

我通常使用.NET 4 TPL从我的ASP.NET应用程序中调用昂贵的Web服务和数据库调用。似乎我可以用Async实现同样的目的。这是真的?何时使用哪个?

提前致谢。

3 个答案:

答案 0 :(得分:15)

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允许您将调用和处理代码放在一起,这样可以使代码更容易编写,以后也更容易阅读。

答案 1 :(得分:0)

关于BeginXXX / EndXXX的@Pawan:我认为你正在混淆这些事情。 查看C#,有3个不同的patterns正在运行的并行代码:

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

TPL是构建TAP的基础。 TPL是在.NET 4中引入的。在Microsoft文档中,Altough TPL和TAP在某种程度上同样使用。无论哪种方式,async / await只是C#5引入的语言特性,意思是.NET 4.5,以简化的方式支持TPL。

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

答案 2 :(得分:-1)

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

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