15.5.1【Task实现细节】 生成的代码

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

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

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

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

 1         static async Task<int> SumCharactersAsync(IEnumerable<char> text)
 2         {
 3             int total = 0;
 4             foreach (char ch in text)
 5             {
 6                 int unicpde = ch;
 7                 await Task.Delay(unicpde);
 8                 total += unicpde;
 9             }
10             await Task.Yield();
11             return total;
12         }

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

原文地址:https://www.cnblogs.com/kikyoqiang/p/10128004.html

时间: 2024-10-14 23:15:29

15.5.1【Task实现细节】 生成的代码的相关文章

[转]MVC实用架构设计(三)——EF-Code First(3):使用T4模板生成相似代码

本文转自:http://www.cnblogs.com/guomingfeng/p/mvc-ef-t4.html 〇.目录 一.前言 二.工具准备 三.T4代码生成预热 (一) 单文件生成:HelloWorld.cs (二) 多文件生成 四.生成数据层实体相关相似代码 (一) 生成准备 (二) 生成实体相关相似代码 生成实体映射配置类 生成实体仓储接口 生成实体仓储实现 五.源码获取 系列导航 一.前言 经过前面EF的<第一篇>与<第二篇>,我们的数据层功能已经较为完善了,但有不少

asp.net中ashx生成验证码代码放在Linux(centos)主机上访问时无法显示问题

最近有个项目加入了验证码功能,就从自己博客以前的代码中找到直接使用,直接访问验证码页面报错如下: 源代码:asp.net中使用一般处理程序生成验证码 Application Exception System.ArgumentException The requested FontFamily could not be found [GDI+ status: FontFamilyNotFound] Description: HTTP 500.Error processing request. De

IDEA——mybatis-generator插件自动生成实体代码(Maven)

利用MyBatis生成器自动生成实体类.DAO接口和Mapping映射文件.  mysql-connector-java-5.1.6-bin.jar mysql驱动包  mybatis-generator-core-1.3.5.jar 自动生成器包 maven 配置mybatis-generator插件 一.pom.xml 两处配置 (1) (2) 二.创建 generatorConfig.xml 配置如下: 1 <?xml version="1.0" encoding=&quo

.NetCore2.1 WebAPI 根据swagger.json自动生成客户端代码

前言 上一篇博客中我们可以得知通过Swagger插件可以很方便的提供给接口开发者在线调试,但是实际上Swagger附带的功能还有很多, 比如使用NSwag生成客户端调用代码,进一步解放接口开发者. NSwag NSwag是一个发布在GitHub上的开源项目,它可以根据Swagger说明页上的swagger.json文件生成C#.TypeScript客户端代码. NSwag的项目地址:https://github.com/RSuter/NSwag Nswag提供4种代码生成方法 1.使用 NSwa

Spices .Net Decompiler生成的代码具备语法高亮、缩进、可折叠和主动提示的代码

Spices .Net Decompiler控件是一款功能强大的代码恢复和反编译工具,支持转换.NET二进制格式((.EXE或.DLL)为格式化的.最佳的源代码,支持MSIL, C#, VB.NET, Delphi.NET, J# 和可管理的C++.具体功能: 转换后的代码具备良好的格式:生成的代码具备语法高亮.缩进.可折叠和主动提示 支持可视的进行反编译 正确的反编译所有类型的程序集:managed (C#, VB.NET, Delphi.NET), CompactFramework and

通过ccb(CocosBuilder)文件生成cocos2dx代码

在C++下使用ccb,绑定调用,成员变量,让人头疼又容易犯错. 自己用pythong写了个小程序,通过ccb文件直接生成C++代码 python我用的不多,又是随性所做,代码质量就很差,大家多多包容吧. 一共包括三个文件,codeGen.py, myCommon.py ,genCpp.py 运行codeGen.py. myCommon.py中包括一些配置信息,根据具体项目自己修改 class projectinfo: def __init__(self): self.projectName='F

js动态生成css代码

用js动态生成css代码 有时候我们需要利用js来动态生成页面上style标签中的css代码,方法很直接,就是直接创建一个style元素,然后设置style元素里面的css代码,最后把它插入到head元素中.但有些兼容性问题我们需要解决.首先在符合w3c标准的浏览器中我们只需要把要插入的css代码作为一个文本节点插入到style元素中即可,而在IE中则需要利用style元素的styleSheet.cssText来解决.还需要注意的就是在有些版本IE中一个页面上style标签数量是有限制的,如果超

matlab 自动生成C代码

1.准备M文件 simpleProduct.m function c = simpleProduct(a,b)c=a*b; 2.在matlab工作界面输入coder,输入工程名称 simpleProduct 3.在工程中添加simpleProduct.m文件 4.定义输入变量a,b的数据类型 5.生成mex函数,测试程序是否正确 6.生成C代码,勾选Generate code only 7.在当前目录的  codegen/lib/simpleProduct/ 下可以看到生成一堆.c 和 .h 文

Eclipse中的快捷键快速生成常用代码(例如无参、带参构造,set、get方法),以及Java中重要的内存分析(栈、堆、方法区、常量池)

Eclipse中的快捷键快速生成常用代码(例如无参.带参构造,set.get方法),以及Java中重要的内存分析(栈.堆.方法区.常量池) 以上就是Eclipse中的快捷键快速生成常用代码(例如无参.带参构造,set.get方法),以及Java中重要的内存分析(栈.堆.方法区.常量池)的全部内容了,更多内容请关注:CPP学习网_CPP大学 本文固定链接:CPP学习网_CPP大学-Eclipse中的快捷键快速生成常用代码(例如无参.带参构造,set.get方法),以及Java中重要的内存分析(栈.