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一样进行一些代码提升?

+0

我编辑只是一个更多的时间来从导致引起改变你不能“与4.0编译错误”。但仍然感谢编辑。 –

async/await无非是C#5.0编译器转换。没有async/awaitIL级别。

一个简单的例子是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包带来了这些类型。

+0

谢谢。但是,Microsoft.Bcl.Async如何告诉编译器使用它们自己的IAsyncStateMachine类型来代替它?我认为编译器总是寻找指定的类型来操作异步/等待? –

+3

对,'Microsoft.Bcl.Async'具有与.NET 4.5中定义的相同的名称空间和相同的类型名称。 – YK1

+0

非常感谢你的回答。 –

MS2012是安装.NET 4.5,以便您描述

+0

虽然4.5是VS2012中的新默认值,但您仍然可以使用.NET 4.0进行开发,其中编译器**会引发错误。 VS2010和VS2012唯一的区别在于错误描述。 –

+0

我确实得到了编译器错误4.0,但肯定错误不是异步/等待,但缺少某些类型,如System.Runtime.CompilerServices.IAsyncStateMachine。我很感激。 –