还在吗?我们开始吧。由于深入讲解需上百页的篇幅,因此这里我不会讲得太深。但我会提 供足够的背景知识,以有助于你对整个结构的理解。之后可通过阅读我近些年来撰写的博客文章, 来了解更加错综复杂的细节,或简单地编写一些异步代码并反编译。同样地,这里我只介绍异步 方法,它包含了所有有趣的机制,并且不需要处理异步匿名函数所处的间接层。

  说明 警告,勇敢的旅行者—— 前方是实现细节! 本节将描述微软C# 5编译器(随着.NET 4.5的发布而推出)内实现的相关内容。从CTP版到beta版,有些细节变化很大,并且在未 来仍有可能发生改变。但我认为其基本理念并不会发生太大的变动。充分了解本节内容 后,你会发现并不存在什么魔法,只不过是一些编译器生成的聪明代码罢了。这之后便 可以从容应对未来变化的细节内容了。 正如我之前多次提到过的,它的实现(包括近似实现和真实编译器生成的代码)基本上可以 说是一个状态机。编译器将生成一个私有的内嵌结构,来表示这个异步方法。这个结构还必须包 含一个方法,其签名与所声明的方法签名相同。我称其为骨架方法,该方法本身没有多少内容, 但其他东西都依赖于它。

  骨架方法需要创建状态机,并执行一个步骤(此处的步骤指执行第一个 await 表达式之前的 代码),然后返回一个表示状态机进度的任务。(别忘了,在第一次到达真正需要等待的 await 表 达式之前,执行过程是同步的。)此后,骨架方法的运作就此结束。状态机会负责其余事项,后 续操作附加到其他异步操作后,可通知状态机去执行另一个步骤。当之前返回的任务被赋予适当 的值后,方法就执行到最后了, 状态机可随即发出信号。

  当然,“执行方法体中的代码”这一步,只有在骨架方法中第一次调用时,才会从方法的开 头执行。以后每次到达该块,都是由后续操作从之前中断的地方开始继续执行。 现在有两个概念需要关注,即骨架方法和状态机。在本节的剩余篇幅中,我将使用单个异步 方法作为示例,如代码清单15-11所示。

         static async Task<int> SumCharactersAsync(IEnumerable<char> text)
{
int total = ;
foreach (char ch in text)
{
int unicpde = ch;
await Task.Delay(unicpde);
total += unicpde;
}
await Task.Yield();
return total;
}

代码清单15-11没有什么实际意义,但我们只关注流控制。在开始之前,有必要指出以下几点。
 该方法包含一个参数( text )。
 该方法包含一个循环,后续操作执行时需跳回该循环内。
 该方法包含两个不同类型的 await 表达式: Task.Delay 返回一个 Task ,而 Task.Yield()则返回一个 YieldAwaitable 。
 该方法包含显式的局部变量( total 、 ch 和 unicode ),需在不同的调用间关注其变化。
 该方法包含一个通过调用 text.GetEnumerator() 方法创建的隐式局部变量。
 该方法最终返回一个值。
这段代码最初的版本将 text 作为 string 类型的参数,但C#编译器会对字符串的迭代进行优
化,并使用 Length 属性和索引器,这会使反编译后的代码变得更加复杂。

最新文章

  1. ExtJS 4.2 评分组件
  2. My安卓知识3--多个activity之前共享数据的方法
  3. bzoj4457: 游戏任务--双层01背包
  4. ubuntu APT-GET工作原理
  5. 网页布局:float与position的区别
  6. Bootstrap--全局CSS样式之排版
  7. Mac下Intellij IDea发布Java Web项目详解三 新建Module
  8. foundation 框架 NSString常用总结(二)
  9. 同步fifo的verilogHDL设计实例
  10. hdu4864Task(馋)
  11. SASS相关
  12. 初探storm
  13. 手游开发之lua的class函数详解
  14. 企业微信自建应用移动端动态获取li并给其事件问题总结
  15. RabbitMQ 使用主题进行消息分发
  16. LabVIEW(二):计数器应用
  17. cf1073c 二分+二维前缀和
  18. Java中Comparable和Comparator区别
  19. hud 3123 GCC
  20. hdu 4882 比赛罚时贪心

热门文章

  1. ZooKeeper动态增加Server(动态增加节点)的研究(待实践)
  2. Linux环境变量设置命令export(转)
  3. HDU 5293
  4. ubuntu 配置静态路由
  5. BeanUtils使用案例
  6. ListView实现简单列表
  7. Spring:验证用户登录
  8. 我在Suse 11 Sp3上使用anaconda安装TensorFlow的过程记录
  9. python 函数参数的传递(参数带星号的说明)
  10. 可持久化Treap(fhq Treap,非旋转式Treap)学习(未完待续)