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”,如您所述