Microsoft.Bcl.Async如何工作?
Microsoft.Bcl.Async
使开发人员能够使用没有.NET Framework 4.5的async/await
关键字,它们应该用于使用它们。Microsoft.Bcl.Async如何工作?
这真是太好了,这要归功于Microsoft CLR和语言团队中人员非常努力的工作。
现在我很好奇这是如何工作的。
async/await
要求编译器做一些繁重的工作,将代码转换成可以等待操作的东西。
编译器最初抛出编译下的.NET Framework 4.0的错误,即使它清楚地知道什么async/await
平均(Visual Studio的2012/2013)。
那么,这怎样库告诉编译器不要把具体编译与异步操作相关的错误,并像.NET Framework 4.5一样进行一些代码提升?
async/await
无非是C#5.0编译器转换。没有async/await
在IL
级别。
一个简单的例子是using() { }
语句,它也是一个编译器转换。它只是将using
语句转换为try/finally
块。但是,依赖于.NET 1.1中定义的接口IDisposable
的存在。
同样,async/await
转换取决于某些类型,如在.NET 4.5中定义的IAsyncStateMachine
接口。 Microsoft.Bcl.Async
将这些类型定义转换为.NET 4.0。
编辑
怎样的Microsoft.Bcl.Async组件会导致编译器来识别新的关键字(异步/等待)?
不,它不。 C#5.0编译器已经知道关键字以及如何处理它们。但是,由于项目针对.NET 4.0,因此无法找到所需的类型。 Microsoft.Bcl.Async
包带来了这些类型。
谢谢。但是,Microsoft.Bcl.Async如何告诉编译器使用它们自己的IAsyncStateMachine类型来代替它?我认为编译器总是寻找指定的类型来操作异步/等待? –
对,'Microsoft.Bcl.Async'具有与.NET 4.5中定义的相同的名称空间和相同的类型名称。 – YK1
非常感谢你的回答。 –
MS2012是安装.NET 4.5,以便您描述
虽然4.5是VS2012中的新默认值,但您仍然可以使用.NET 4.0进行开发,其中编译器**会引发错误。 VS2010和VS2012唯一的区别在于错误描述。 –
我确实得到了编译器错误4.0,但肯定错误不是异步/等待,但缺少某些类型,如System.Runtime.CompilerServices.IAsyncStateMachine。我很感激。 –
我编辑只是一个更多的时间来从导致引起改变你不能“与4.0编译错误”。但仍然感谢编辑。 –