-
C#教程之C#教程之C#异步的世界【下】(2)
本站最新发布 C#从入门到精通
试听地址 https://www.xin3721.com/eschool/CSharpxin3721/
, http = http, url = url, time = time, _builder = AsyncTaskMethodBuilder<string>.Create(), _state = -1 }; stateMachine._builder.Start(ref stateMachine); return stateMachine._builder.Task; }
试听地址 https://www.xin3721.com/eschool/CSharpxin3721/
, http = http, url = url, time = time, _builder = AsyncTaskMethodBuilder<string>.Create(), _state = -1 }; stateMachine._builder.Start(ref stateMachine); return stateMachine._builder.Task; }
方法签名完全一致,只是里面的内容变成了一个状态机 GetUrlStringAsyncdStateMachine 的调用。此状态机就是编译器自动创建的。下面来看看神秘的状态机是什么鬼:
明显多个异步等待执行的时候就是在不断调用状态机中的MoveNext()方法。经验来至我们之前分析过的IEumerable,不过今天的这个明显复杂度要高于以前的那个。猜测是如此,我们还是来验证下事实:
在起始方法 GetUrlStringAsync 第一次启动状态机 stateMachine._builder.Start(ref stateMachine);
确实是调用了 MoveNext 。因为_state的初始值是-1,所以执行到了下面的位置:
绕了一圈又回到了 MoveNext 。由此,我们可以现象成多个异步调用就是在不断执行MoveNext直到结束。
说了这么久有什么意思呢,似乎忘记了我们的目的是要通过之前编写的测试代码来分析异步的执行逻辑的。
再次贴出之前的测试代码,以免忘记了。
反编译后代码执行逻辑图:
当然这只是可能性较大的执行流程,但也有 awaiter.Iscompleted 为 true 的情况。其他可能的留着大家自己去琢磨吧。
本文已同步至索引目录:《C#基础知识巩固》
本文demo:https://github.com/zhaopeiym/BlogDemoCode