原文:http://www.blogcn.com/user8/flier_lu/index.html?id=3409568
实际上,这一机制的最终目的是提供一个代码协同执行的支持机制. 【程序编程相关:判断表中的数据是否被其他表中使用过!!】几个月前我曾大致分析过 c# 2.0 中 iterator block 机制的实现原理,«c# 2.0 中iterators的改进与实现原理浅析»,文中简要介绍了 c# 2.0 是如何在不修改 clr 的前提下由编译器,通过有限状态机来实现 iterator block 中 yield 关键字. 【推荐阅读:在 ASP.NET 中执行 URL 重写】
【扩展信息:ASP在线压(缩)解(压)rar】 以下内容为程序代码:using system.collections.generic;public class tokens : ienumerable<string>{ public ienumerator<string> getenumerator() { for(int i = 0; i<elements.length; i++) yield elements[i]; } ...}foreach (string item in new tokens()){ console.writeline(item);} 在这段代码执行过程中,foreach 的循环体与 getenumerator 函数体实际上是在同一个线程中交替执行的.这是一种介于线程与顺序执行之间的协同执行模式,之所以称之为协同(coroutine),是因为同时执行的多个代码块之间的调度是由逻辑隐式协同完成的.顺序执行无所谓并行性,而线程往往是由系统调度程序强制性抢先切换,相对来说win3.x 中的独占式多任务倒是与协同模型比较类似. 就协同执行而言,从功能上可以分为行为.控制两部分,控制又可进一步细分为控制逻辑与控制状态.行为对应着如何处理目标对象,如上述代码中:行为就是将目标对象打印到控制台;控制则是如何遍历这个 elements 数组,可进一步细分为控制逻辑(顺序遍历)与控制状态(当前遍历到哪个元素).下面将按照这个逻辑介绍不同语言中如何实现与模拟这些逻辑. spark gray 在其 blog 上有一个系列文章介绍了协同执行的一些概念.... 下一页