我开始阅读有关.NET 4.5异步编程的内容,但实际上在使用模式方面还不能充分理解。因此,我将尝试通过一个直接的问题来了解:
我通常使用.NET 4 TPL从我的ASP.NET应用程序内部调用昂贵的Web服务和数据库调用。看起来我可以使用Async来实现同样的功能。这是真的吗?何时使用哪个?
提前感谢。
我开始阅读有关.NET 4.5异步编程的内容,但实际上在使用模式方面还不能充分理解。因此,我将尝试通过一个直接的问题来了解:
我通常使用.NET 4 TPL从我的ASP.NET应用程序内部调用昂贵的Web服务和数据库调用。看起来我可以使用Async来实现同样的功能。这是真的吗?何时使用哪个?
提前感谢。
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
允许您将调用和处理代码结合在一起,这应该使您的代码更容易编写,也更容易阅读。
@Pawan 关于BeginXXX/EndXXX:我觉得你把事情搞混了。 看看C#,有三种不同的并行代码运行模式:
TPL是TAP构建的基础。TPL在.NET 4中引入。虽然TPL和TAP在Microsoft文档中有些相等地使用。无论如何,async/await只是C# 5引入的一种语言特性,意味着.NET 4.5,以简化对TPL的支持。
BeginXXX/EndXXX属于APM风格!所以它与TPL没有任何关系。这些多个版本使得保持概览变得困难。
我猜测在内部,.Net TPL和async都使用线程池线程。Async可能是传统的BeginXXX/EndXXX模式的简化语法。
但更重要的是TPL使用线程池线程,您不应该将其用于执行昂贵的操作,因为框架本身也使用相同的线程。如果您有昂贵的操作(如您所提到的),则最好创建一个新的独立线程或在使用TPL时设置ThreadSchedular的“LongRunning”属性。