你的位置:首页 > 软件开发 > ASP.net > [C#]async和await刨根问底

[C#]async和await刨根问底

发布时间:2015-06-25 00:03:32
上一篇随笔留下了几个问题没能解决:· 调用IAsyncStateMachine.MoveNext方法的线程何时发起的?· lambda的执行为何先于MoveNext方法?· 后执行的MoveNext方法做了些什么事 ...

[C#]async和await刨根问底

上一篇随笔留下了几个问题没能解决:

一、哪里来的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#

C#
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录