Microsoft.Bcl.Async如何工作?

Dea*_*Seo 11 .net c# base-class-library async-await

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

YK1*_*YK1 11

async/await只不过是C#5.0编译器转换.有没有async/awaitIL一级.

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

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

编辑

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

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

  • 是的,`Microsoft.Bcl.Async`具有与.NET 4.5中定义的相同的名称空间和相同的类型名称. (4认同)
  • 有关编译器类型的更多信息,请参阅[Jon Skeet的eduasync系列](http://msmvps.com/blogs/jon_skeet/archive/tags/Eduasync/default.aspx). (3认同)