上一篇随笔留下了几个问题没能解决:· 调用IAsyncStateMachine.MoveNext方法的线程何时发起的?· lambda的执行为何先于MoveNext方法?· 后执行的MoveNext方法做了些什么事 ...
上一篇随笔留下了几个问题没能解决:
一、哪里来的get='_blank'>线程?
通过上一篇随笔的调查我们知道了,async标记的方法的方法体会被编译到一个内部结构体的MoveNext方法中,并且也找到了MoveNext的调用者,再且也证实了有两个调用者是来自于主线程之外的同一个工作线程。
二、lambda为何先行?
先来回忆一下GetHere方法的内容:
// 三、理解awaitTask<string> GetHere(){ return Task.Run(() => { Thread.Sleep(1000); return "HERE"; });}
三、MoveNext干了什么?
第二个问题虽然解决了,但是也让第三个问题显得更加重要,既然lambda确实是先于MoveNext,那么MoveNext到底做了些什么?
四、水落石出
async和await的轮廓逐渐清晰了~再结合上一篇的一段代码来看看:
// 二、理解asyncvoid MoveNext(){ bool local0; Exception local1; try { local0 = true; Thread.Sleep(1000); Console.WriteLine("HERE"); } catch (Exception e) { local1 = e; this.'<>1__state' = -2; this.'<>t__builder'.SetException(local1); return; } this.'<>1__state' = -2; this.'<>t__builder'.SetResult()}
最终调查结果如下:
原标题:[C#]async和await刨根问底
关键词:C#
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。