新的C#异步功能是否在编译器中严格实现

时间:2013-03-11 21:45:08

标签: c# .net asynchronous clr async-await

作为一名有兴趣探索“工作原理”的C#程序员,我有兴趣了解更多关于使新的异步功能发挥作用的过程。

我已经关注了Eric Lippert关于异步的优秀文章系列:Async blog posts

我不记得在任何地方看到任何对此功能的实现的引用(在高级别),除了“编译器正在为我们完成大部分工作”这一事实。

这个功能严格来说是编译器功能吗?编译器是否以某种方式重写代码,那就是它?还是有其他的东西,比如运行时支持,可以实现这一点?

1 个答案:

答案 0 :(得分:20)

不,它在编译器中不是完全。它依赖于一些新的接口,例如INotifyCompletion和一些框架实现支持,例如AsyncTaskMethodBuilder。我认为不需要进行任何CLR更改。

编译器做了很多工作,构建了一个状态机 - 它只是引用了状态机中的一些类型。哦,很多Task - 相关类型都是出于性能原因而进行了重大修改。

我有一个series of blog posts最初是针对CTP编写的,但使用vanilla .NET 4和我自己掀起的一些类。它们不会对生产实施起作用(随着时间的推移,情况会有所改变),但它们会给你一个关于幕后发生的事情的总体印象。