Microsoft.Bcl.Async如何工作?

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下一样解除一些代码?

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

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

同样, async/await转换依赖于某些类型,如.NET 4.5中定义的IAsyncStateMachine接口。 Microsoft.Bcl.Async将这些类型定义获取到.NET 4.0。

编辑

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

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

MS2012正在安装.net 4.5,因此您无法获得“编译错误4.0”,如您所述