使用非异步方法调用可异步方法(内含嵌套异步)

效果图:

代码(在控制台mian函数中运行该函数):

        private static void AsyncTest(){Func<Task<string>> Fun1 = () =>{Thread.Sleep(4000); Console.WriteLine("Fun1 Open");return Task.Run(()=>{Thread.Sleep(2000);Console.WriteLine("Fun1 Run Open");Console.WriteLine("..............................");Thread.Sleep(5000);Console.WriteLine("..............................");Console.WriteLine("Fun1 Run Close");return "Fun1";}); }; Func<Task<string>> Fun2 = async () =>{Thread.Sleep(1000); Console.WriteLine("Fun2 Open"); var str2 = await Fun1(); Thread.Sleep(1000);Console.WriteLine("Fun1 Result "+ str2);Console.WriteLine("Fun2 Close"); return "Fun2";};Console.WriteLine("Asyn Open"); var str = Fun2();Console.WriteLine("Fun2 Result " + str); Console.WriteLine("Asyn Close");}

情景:

  1. 两个异步程序Fun2/Fun1
  2. Fun2使用(await)调用Fun1
  3. Fun2不使用异步调用

分析:

  1. 主线程执行过程中,遇到异步Fun2,执行同步过程,进入函数Fun2
  2. 函数Fun2执行过程中,遇到异步Fun1,执行异步过程await,进入Fun1
  3. 函数Fun1执行过程中,遇到异步时间Run,开启异步
  4. 主函数不等待异步,Fun1无返回值,输出Task对象
  5. 函数Fun2等待Fun1结果,再执行await后的语句

结论:

  1. 封装后的异步调用,如果被同步调用,应该使用void/Task无返回值方式
  2. await后的语句,相当于异步调用后的回调方法,写法更美观

使用await调用异步方法(嵌套异步)

代码:

var str = await Fun2();

在上文代码中Fun2函数前面加上await

效果图:

分析:

  1. 主线程执行过程中,遇到异步Fun2,执行异步过程await,进入函数Fun2
  2. 函数Fun2执行过程中,遇到异步Fun1,执行异步过程await,进入Fun1
  3. 函数Fun1执行过程中,遇到异步时间Run,开启异步
  4. 函数Fun2等待Fun1结果,再执行await后的语句
  5. 主函数等待Fun2结果,再执行await后的语句

结论:

  1. 要想达到嵌套异步的回调效果,每一个异步环节都要使用await标记分割

使用await调用异步方法(连续await)

效果图

代码:

Fun1添加参数p做区分,Fun2添加并行的await

            Func<string, Task<string>> Fun1 = (string p) =>{Thread.Sleep(4000); Console.WriteLine("Fun1 Open " + p);return Task.Run(()=>{Thread.Sleep(2000);Console.WriteLine("Fun1 Run Open " + p);Console.WriteLine("..............................");Thread.Sleep(5000);Console.WriteLine("..............................");Console.WriteLine("Fun1 Run Close " + p);return "Fun1 " + p;}); }; Func<Task<string>> Fun2 = async () =>{Thread.Sleep(1000); Console.WriteLine("Fun2 Open"); var str2 = await Fun1("No.1"); Thread.Sleep(1000);Console.WriteLine("Fun1 Result "+ str2);str2 = await Fun1("No.2");Thread.Sleep(1000);Console.WriteLine("Fun1 Result " + str2);Console.WriteLine("Fun2 Close"); return "Fun2";};

结论:

  1. 多个await并不会破坏await的“异步回调模式”
  2. 在上一个await执行回调后,下一个await作为回调函数内的语句继续执行await的过程
  3. 该语法糖很好吃,很强大的语法,拯救了键盘。

注意:

await异步回调的边界,是async所标记的函数的边界。其async函数内部的循环/判断等语句,都要服从与await的等待与回调过程。

C# async/awit 嵌套异步 执行顺序 分析相关推荐

  1. 详解promise、async和await的执行顺序

    说明: 本文摘自 详解 promise.async和await的执行顺序. 1.题目和答案 一道题题目:下面这段promise.async和await代码,请问控制台打印的顺序? async func ...

  2. javascript的异步执行顺序---管中窥豹

    有一个经典例子: for (var i = 0; i < 10; i++) {setTimeout(function() { console.log(i); }, 100 * i); } 介绍一 ...

  3. mysql 执行顺序 SQL语句执行顺序分析

    最近在做一个数据库的大作业,算是复习了下MySql里面比较复杂的一些语句的用法,如Left Join之类的.在这里就不对具体语法进行记录了,希望能在以后经常用到,而不是隔好长时间用一次.在这里就记录下 ...

  4. MATLAB多个for循环嵌套的执行顺序、如何将生成的数据存放在一个向量或矩阵里?

    MATLAB中多个for循环嵌套的执行顺序: 当有两个for循环时,先执行一次外部for循环,再将内部循环全部执行. 当有三个for循环时,先执行一次最外部for循环,再执行一次第二层for循环,最后 ...

  5. SQL嵌套语句执行顺序

    首先我们要了解一下SQL语句的执行过程. SELECT 字段  FROM 表名  WHERE 条件表达式 那它们是按什么顺序执行呢?分析器会先看语句的第一个词,当它发现第一个词是SELECT关键字的时 ...

  6. Ajax同步异步执行顺序问题

    今天项目中碰到一个问题,大概是这样的:JS中一个方法A需要先给隐藏域赋值,然后另一个方法B再从这个隐藏域取值,获取到这个值后给接口传参然后请求数据.也就是说这两个方法需要有执行顺序,A方法先执行,然后 ...

  7. 浅谈jQuery技术的ajax框架async同步和异步执行原理

    我们很多同学呀,不知道ajax框架async属性到底有什么作用,它在页面中的执行顺序到底是什么样的? 比如说我前端页面有以下几个方法: window.οnlοad= function charts() ...

  8. php 内部异步执行顺序,event_loop中不同异步操作的执行顺序

    关于js的单线程.怎么创建一个异步任务都是老生常谈的话题了,我们今天就总结一下js不同的异步操作到底执行顺序如何. 首先我们要明白js两种任务类型,一个是macrotask(宏任务),一个是 micr ...

  9. springMVC中拦截器执行时机和执行顺序分析

    1. 拦截器的作用时机 和过滤器一样,拦截器也可以拦截请求. 过滤器是在DispatcherServlet处理之前拦截,拦截器是在DispatcherServlet处理请求然后调用控制器方法(即我们自 ...

最新文章

  1. linux shell ddos木马,利用Shell 脚本解决DDOS攻击问题
  2. ajax response.write 执行失败_Day 42:一人分饰三角,初识AJAX
  3. python每隔30s检查一次_用Python写一个“离线语音提示器”来提醒我们别忘记了时间...
  4. 自治时代:Oracle 公有云离我们很近,自治数据库离我们还远
  5. Python编程基础19:封装、继承与多态
  6. 蜜雪冰城“骗局”:年赚8亿,竟不是靠卖奶茶?!
  7. 什么是分布式事务?2PC、XA、3PC、TCC
  8. android 仿小米秒表,android实现秒表功能
  9. SQLServer之修改标量值函数
  10. 如何拒绝国外IP/屏蔽国外IP访问服务器?
  11. MATLAB数学建模方法与实践(第3版)——读书笔记
  12. 开源的调查问卷平台LimeSurvey
  13. 同步十二进制加法计数电路设计(D触发器)
  14. 网易公开课视频及字幕下载
  15. 用Python解决实际问题:给100首情诗增加换行
  16. 唯品会导航栏简单制作
  17. 新员工转正述职报告PPT模板
  18. Mac邮件客户端怎么添加QQ邮箱
  19. c++ 反射_基于飞凌FETA40i-C核心板在光时域反射仪中的应用原理
  20. 从刘维尔方程到Velocity-Verlet算法

热门文章

  1. 单片机机器周期怎么计算公式_单片机指令周期怎么计算
  2. 关于外贸的相关知识和经验(上)
  3. 力扣刷题day44|309最佳买卖股票时机含冷冻期、714买卖股票的最佳时机含手续费
  4. 北大软微计算机技术考研专业课,【2019年最新招生目录】北京大学软微学院软件工程考研专业课如何备考 参...
  5. 数据分析方法——回归分析
  6. js实现多个小方格输入验证码,一格输入完成后自动聚焦到下一格
  7. TDengine TDengine ERROR (8000000b)
  8. WebRTC ULPFEC
  9. verilog搭建单周期CPU与流水线CPU
  10. JAVA类的继承 Teacher和Student