摘要: 谈到栈帧(stack frame)时,可能会想到在方法中声明的局部变量。当然,可能还会注意到 一些隐藏的局部变量,如 foreach 循环中的迭代器。但栈上的内容不止这些,至少逻辑上是这样 。 很多情况下,在一些表达式还没有计算出来前,另一些中间表达式是不能使用的。最简单的例子 莫过于加法等二进制操 阅读全文
posted @ 2018-12-16 21:50 一只桔子2233 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 任何 await 表达式均表示执行路径的一个分支。首先,被等待的异步操作得到一个awaiter,然后检查其 IsCompleted 属性。若返回 true ,即可立即获得结果并继续。否则,需进行以下处理。  存储awaiter,以供后面使用。  更新状态,以表示从哪里继续。  为awaiter 阅读全文
posted @ 2018-12-16 21:40 一只桔子2233 阅读(293) 评论(0) 推荐(0) 编辑
摘要: 如果你反编译过异步方法(我非常希望你会这么做),会看到状态机中的 MoveNext() 方法 非常长,变化非常快,像是一个计算有多少 await 表达式的函数。它包含原始方法中的所有逻辑, 和处理所有状态变换所需要的芭蕾舞步 ① ,以及用来处理整个结果或异常的包装代码。 在手动编写异步代码时,你通常 阅读全文
posted @ 2018-12-16 21:33 一只桔子2233 阅读(176) 评论(0) 推荐(0) 编辑
摘要: 状态机的整体结构非常简单。它总是使用显式接口实现,以实现.NET 4.5引入的 IAsync StateMachine 接口,并且只包含该接口声明的两个方法,即 MoveNext 和 SetStateMachine 。 此外,它还拥有大量私有或公共字段。 状态机的声明在折叠后如代码清单15-11所示 阅读全文
posted @ 2018-12-16 21:23 一只桔子2233 阅读(644) 评论(0) 推荐(0) 编辑
摘要: 尽管骨架方法中的代码非常简单,但它暗示了状态机的职责。代码清单15-11生成的骨架方 法如下所示: AsyncStateMachineAttribute 类型是为 async 引入的新特性(attribute)之一。它是为工具而设计的,你自己并不会有机会消费这个特性,并且也不应该在自己的方法上应用这 阅读全文
posted @ 2018-12-16 21:13 一只桔子2233 阅读(266) 评论(0) 推荐(0) 编辑
摘要: 还在吗?我们开始吧。由于深入讲解需上百页的篇幅,因此这里我不会讲得太深。但我会提 供足够的背景知识,以有助于你对整个结构的理解。之后可通过阅读我近些年来撰写的博客文章, 来了解更加错综复杂的细节,或简单地编写一些异步代码并反编译。同样地,这里我只介绍异步 方法,它包含了所有有趣的机制,并且不需要处理 阅读全文
posted @ 2018-12-16 20:55 一只桔子2233 阅读(198) 评论(0) 推荐(0) 编辑
摘要: https://blog.csdn.net/hurrycxd/article/details/79827958 书上看到一个Task.Yield例子,Task.Yield方法创建一个立即返回的awaitable。等待一个Yield可以让异步方法在执行后续的部分时返回到调用方法。可以理解为离开当前的消 阅读全文
posted @ 2018-12-16 20:45 一只桔子2233 阅读(486) 评论(1) 推荐(0) 编辑
摘要: 此处我故意选择这样的值,以便让第二个操作早于第一个完成。但由于我们要在等待第一个 操作完成后再打印结果(使用 Result 属性,这将阻塞线程直到任务结束。再次强调一遍,运行 这样的代码时要十分谨慎!) 将异步代码放到异步方法中,也可得到同样的结果。 异步匿名函数并不会让我感到特别兴奋,但它也有自己 阅读全文
posted @ 2018-12-16 19:59 一只桔子2233 阅读(361) 评论(0) 推荐(0) 编辑