栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

解密async await 原理(.net)

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

解密async await  原理(.net)

我们经常用async和await实现异步方法,那么他的实现原理是什么呢,今天介绍一下。

一.代码

1:介绍原理之前,先看一段简单的代码:

2:代码执行结果,如下所示,想必结果和大家的预期是一样的:

二.工具

研究async await使用的工具是dotPeek,注意:要勾选 show compiler-generated code。下载地址:https://www.jetbrains.com/decompiler/download/#section=web-installer

三.原理

也许大家都听说过,async await 是一个语法糖,编译器会生成一个状态机,那么这个状态机是什么样子,它又是怎样工作的呢?

1:通过dotPeek工具,进行反编译,会看到如下两段代码:


2:方法SetName:

  1. 在方法SetName上添加了一个状态机特性,类型是Program.d__1
  2. 在方法SetName在方法里面先实例化了一个状态机
  3. 传递参数
  4. 使用AsyncVoidMethodBuilder创建了一个builder
  5. 将状态机的状态置成-1
  6. 启动状态机

3:类d__1,我们只关注里面的核心代码IAsyncStateMachine.MoveNext(),这里包括状态机的执行逻辑:

4:介绍一下AsyncVoidMethodBuilder,否则整个过程串不起来:

  1. 通过使用AsyncVoidMethodBuilder的start方法启动状态机,那么如何启动的呢?让我们看下源码。

    由此可见 ,通过Start方法,我们可以看到内部是通过调动状态机的MoveNext的方法,启动状态机的。

  2. 通过使用AsyncVoidMethodBuilder的AwaitUnsafeOnCompleted方法注册了任务完成后的回调方法,那么是如何实现的呢?让我们看下源码。

    由此可见,通过调用GetCompletionAction来获取状态机的执行方法(MoveNext),并赋值给continuation,将continuation注册到awaiter的回调函数。

5.看一下await的执行流程图,如下所示:

四.总结

当我们使用async方法是,编译器就会生成一个状态机,在方法内部的await会做如下两件事:
1:执行await表达式
2:查看等待的方法是否完成

  1. 如果完成,则执行方法中剩余的部分
  2. 如果没有完成,当任务完成后,用回调函数来执行剩余的部分
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/910433.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号