Microsoft.Bcl.Async如何工作?

时间:2014-02-27 06:28:03

标签: c# .net async-await base-class-library

Microsoft.Bcl.Async使开发人员可以使用async/await关键字而不使用.NET Framework 4.5来定位他们的目标。

由于Microsoft CLR和语言团队中人员的辛勤工作,这很棒。

现在我很好奇这是如何运作的。

async/await要求编译器做一些繁重的工作,将代码变成可以等待操作的东西。

编译器最初在.NET Framework 4.0下引发编译错误,即使它清楚地知道async/await的含义(Visual Studio 2012/2013。)

那么这个库如何告诉编译器不要抛出与异步操作相关的特定编译错误,并且像在.NET Framework 4.5下一样解除一些代码?

2 个答案:

答案 0 :(得分:11)

async/await只不过是C#5.0编译器转换。在async/await级别没有IL

一个简单的例子是using() { }语句,它也是一个编译器转换。它只是将using语句转换为try/finally块。但是,存在依赖于{1.1}接口的存在,该接口在.NET 1.1中定义。

类似地,IDisposable转换依赖于某些类型,例如在.NET 4.5中定义的async/await接口。 IAsyncStateMachine将这些类型定义提供给.NET 4.0。

修改

  

Microsoft.Bcl.Async程序集如何使编译器识别新关键字(async / await)?

不,不。 C#5.0编译器已经知道关键字以及如何处理它们。但是,由于项目针对.NET 4.0,因此无法找到所需的类型。 Microsoft.Bcl.Async包带来了这些类型。

答案 1 :(得分:-3)

MS2012正在安装.net 4.5,因此您无法按照描述的那样获得“4.0编译错误”