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

lys*_*cid 6 .net c# clr asynchronous async-await

作为一名C#程序员,他有兴趣探索"如何工作",我有兴趣了解更多关于使新异步功能工作的过程.

我关注过Eric Lippert关于异步的优秀文章系列:异步博客文章

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

这个功能严格来说是编译器功能吗?编译器是否以某种方式重写代码,那就是它?还是有其他的东西,如运行时支持,使这种情况发生?

Jon*_*eet 20

不,它不完全在编译器中.它依赖于一些新的接口,例如INotifyCompletion和一些框架实现支持AsyncTaskMethodBuilder.我不相信有任何CLR更改需要.

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

我有一系列博客文章,最初是针对CTP编写的,但使用了vanilla .NET 4和一些我自己掀起的课程.他们不会反对生产实施(随着时间的推移,事情会发生一些变化),但他们会给你一个关于幕后发生的事情的总体印象.

  • @ lysergic-acid:是的,Stephen Toub.Jon的观点是,如果有CLR更改**需要*来进行异步工作,那么制作一个*库*会很难在先前版本上启用异步.这种库的存在证明没有CLR变化. (5认同)
  • FGITW备份了一系列*博客文章.很难不赞成这一点.我还在努力完成你的Edulinq系列. (2认同)
  • 我不记得CLR有任何变化,但我没有密切关注.斯蒂芬肯定知道. (2认同)