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

  说明 警告,勇敢的旅行者—— 前方是实现细节! 本节将描述微软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

15.5.1【Task实现细节】 生成的代码相关推荐

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

    本文转自:http://www.cnblogs.com/guomingfeng/p/mvc-ef-t4.html 〇.目录 一.前言 二.工具准备 三.T4代码生成预热 (一) 单文件生成:Hello ...

  2. 【self-instruct方式生成语料代码实战】

    self-instruct方式生成语料代码实战 self-instruct 介绍 self-instruct 框架 生成语料代码实现过程 Step1 通过模型生成新的指令 Step2 对模型生成的指令 ...

  3. python灰度图生成g代码_Artcam2009利用灰度图生成雕刻机所需的G代码

    双击桌面的artcam快捷方式图标打开软件首先看到如下 的界面.点击"通过图像产生模型" 利用ART CAM 软件制作浮雕刀路的方法 Artcam2009利用灰度图生成雕刻机所需的 ...

  4. AI生成的代码你敢用吗?

    选自gist.github 作者:0xabad1dea 机器之心编译 编辑:Panda 近日,GitHub 推出了一款利用人工智能生成模型来合成代码的工具--Copilot,但发布之后却饱受争议,包括 ...

  5. AI生成的代码你敢用吗?有人给最近走红的Copilot做了个“风险评估”

    来源:机器之心本文约5100字,建议阅读10分钟 本文为你介绍一款利用人工智能生成模型来合成代码的工具-Copilot. 近日,GitHub 推出了一款利用人工智能生成模型来合成代码的工具--Copi ...

  6. android studio 混淆jar,android studio如何生成混淆代码的jar

    释放双眼,带上耳机,听听看~! 今天,简单讲讲android里如何在生成jar包时,同时对jar包的代码进行混淆,避免别人看到核心代码. 之前,我对领导说我打包生成的SDK,别人使用android s ...

  7. sqlaction 更新至 v0.2.1.0,自动生成 JDBC 代码的数据库持久层工具

    开发四年只会写业务代码,分布式高并发都不会还做程序员?   0.2.1.0        2019-04-17        calvin             * 新增拦截器"@@STA ...

  8. DL之RNN:人工智能为你写代码——基于TF利用RNN算法实现生成编程语言代码(C++语言)、训练测试过程全记录

    DL之RNN:基于TF利用RNN算法实现生成编程语言代码(C语言).训练&测试过程全记录 目录 输出结果 监控模型 训练&测试过程全记录 训练的数据集展示 输出结果 1.test01 ...

  9. android studio如何生成混淆代码的jar

    今天,简单讲讲android里如何在生成jar包时,同时对jar包的代码进行混淆,避免别人看到核心代码. 之前,我对领导说我打包生成的SDK,别人使用android studio导入后可以看所有的源码 ...

最新文章

  1. 2022-2028中国曝光机市场现状及未来发展趋势
  2. 字符串转换 - 应该熟练掌握的东西
  3. Traffic Simulator Applet(交通模拟器小程序)
  4. 「递归」第6集 | 是鹅厂技术青年的模样
  5. #191 sea(动态规划)
  6. Windows:将cmd命令行添加到右键中方法
  7. 所见即搜,3分钟教你搭建一个服装搜索系统!
  8. python版webpower的edm的api接口
  9. 基于 OS X Mavericks 系统
  10. 开启微信悬浮窗权限有什么用_这个功能比微信自带的还好用
  11. c语言如何判断字符类型,数据类型怎么判断 C语言中如何判断数据类型
  12. docker以外的构建、运行、管理和分发容器候选项
  13. 区块链技术DIY--xmz
  14. vue 中的el表达式_解释el页面数据表达式
  15. 自己写一个调查问卷Web项目 (超详细版)
  16. R语言获取丁香园疫情数据动态网站
  17. 【kali-漏洞利用】(3.4)免杀Payload 生成工具(上):Veil安装、启动、Can‘t find the WINE profile问题
  18. 使用Scrapy框架爬取88读书网小说,并保存本地文件
  19. 新氧放弃私有化:曾由CEO金星发起 公司市值已不足1亿美元
  20. 游戏发展演变:何谓第三代网游?

热门文章

  1. 笔记.NET基础知识05
  2. Linux学习笔记13--使用mount命令挂载CDROM
  3. 我的网络安全第三次实验汇报
  4. DatabaseMetaData information is not known for server DB2/xxx by this version of JDBC driver
  5. 那年学过的web后端笔记
  6. 读书笔记_中国期货市场量化交易(李尉)05
  7. weblogic mysql数据源配置文件_通过weblogic数据源实现配置oracle and mysql方法
  8. mtk 帧同步_【小松教你手游开发】【面试必读(编程基础)】网络游戏同步方式(帧同步和状态同步)...
  9. android随机抽奖代码_用Excel实现不放回随机抽样
  10. 计算机网络在实践中的应用,计算机网络技术在实践中的应用