作为一个对探索“事物如何工作”感兴趣的 C# 程序员,我有兴趣更多地了解使新异步功能工作的过程。
我关注了 Eric Lippert 关于异步的优秀文章系列:异步博客文章
除了“编译器正在为我们完成大部分工作”这一事实之外,我不记得在任何地方看到过任何关于此功能实现的参考(在高层次上)。
那么这个特性严格来说是编译器特性吗?编译器是否以某种方式重写代码,仅此而已?还是有其他的东西,比如运行时支持,可以做到这一点?
作为一个对探索“事物如何工作”感兴趣的 C# 程序员,我有兴趣更多地了解使新异步功能工作的过程。
我关注了 Eric Lippert 关于异步的优秀文章系列:异步博客文章
除了“编译器正在为我们完成大部分工作”这一事实之外,我不记得在任何地方看到过任何关于此功能实现的参考(在高层次上)。
那么这个特性严格来说是编译器特性吗?编译器是否以某种方式重写代码,仅此而已?还是有其他的东西,比如运行时支持,可以做到这一点?
不,它不完全在编译器中。它依赖于一些新的接口,例如INotifyCompletion
和一些框架实现支持,例如AsyncTaskMethodBuilder
. 我不相信需要任何 CLR 更改。
编译器做了很多工作,构建了一个状态机——它只是引用了状态机中的一些类型。哦,许多与 -Task
相关的类型主要出于性能原因而进行了重大修改。
我有一系列博客文章,最初是针对 CTP 编写的,但仅使用 vanilla .NET 4 和一些我自己编写的类。它们不会对生产实施产生影响(因为随着时间的推移情况会发生一些变化),但它们会给你一个幕后发生的总体印象。