async await 状态机理解
public async Task<string> Wait3S()
{
await Task.Delay(3000);
Console.WriteLine("Wait 3 S");
return "";
}
#region 异步任务-状态机
#if true
TestClass testClass = new TestClass();
//调用testClass的Wait3S方法执行
var Wait3S = testClass.Wait3S();
//每次await其实都是去检测Wait3S这个任务有没有完成(状态),如果完成了就直接获得了结果,不需要在执行这个任务(调用方法),如果未完成则会继续完成这个任务
await Wait3S;
await Wait3S;
await Wait3S;
await Wait3S;
await Wait3S;
await Wait3S;
#endif
#endregion
由于TestClass的Wait3S方法是一个异步方法,里面的
await Task.Delay(3000);会进行等待,整个方法可以看做一个同步调用方式,所以在调用
var Wait3S = testClass.Wait3S();时就就完成了这个任务
后续的
await Wait3S; 只是检测任务状态,由于任务已经完成,马上就拿到了结果。
将Wait3S方法进行改造
public async Task<string> Wait3S()
{
await Task.Delay(3000); //去掉await
Console.WriteLine("Wait 3 S");
return "";
}
由于去掉了await,这个任务耗时可以忽略不计,当调用
var Wait3S = testClass.Wait3S();时任务并未完成,
在后续调用
await Wait3S;
await Wait3S;
await Wait3S;
await Wait3S;
await Wait3S;
await Wait3S;
检查任务状态时,第一个检测点发现任务状态未完成,会继续调用
TestClass的 Wait3S 方法执行
结论
async await底层是一个状态机,没一次await都是去检测这个任务是否已经完成,如果完成了直接获取结果,如果没有完成,则会继续执行并等待这个任务完成。
无论调用多少次 await Wait3S; 都只会执行一次任务(Console.WriteLine("Wait 3 S")只会输出一次)。
async await 状态机理解的更多相关文章
- async/await 深度理解使用
在vue中使用 eg async created () { await setTimeout(()=>{ console.log(1) },5000); }, async mounted () ...
- 研究c#异步操作async await状态机的总结
前言 前一段时间得闲的时候优化了一下我之前的轮子[DotNetCoreRpc]小框架,其中主要的优化点主要是关于RPC异步契约调用的相关逻辑.在此过程中进一步了解了关于async和await异步操作相 ...
- C# 学习async/await(个人理解)
await : 等待的意思 async:异步(非同步) 当我们方法内部 存在await的时候,就返回出去 执行下一步 ,等await后面的方法执行完毕 在执行await下面的方法 一.我们先看正常 ...
- 关于异步执行(Async/await)的理解(转发)
原文地址: http://blog.jobbole.com/85787/ 同步编程与异步编程 通常情况下,我们写的C#代码就是同步的,运行在同一个线程中,从程序的第一行代码到最后一句代码顺序执行.而异 ...
- async/await 的理解
1.如果一个方法标记了 async 关键字,那么这个方法被调用时就是异步执行: 2.利用Task运行一个任务,这个任务里的函数也是异步执行: 3.如果一个任务前被标记await,那么等待这个任务执行完 ...
- async/await到底该怎么用?如何理解多线程与异步之间的关系?
前言 如标题所诉,本文主要是解决是什么,怎么用的问题,然后会说明为什么这么用.因为我发现很多萌新都会对之类的问题产生疑惑,包括我最初的我,网络上的博客大多知识零散,刚开始看相关博文的时候,就这样.然后 ...
- 理解C#中的 async await
前言 一个老掉牙的话题,园子里的相关优秀文章已经有很多了,我写这篇文章完全是想以自己的思维方式来谈一谈自己的理解.(PS:文中涉及到了大量反编译源码,需要静下心来细细品味) 从简单开始 为了更容易理解 ...
- 你眼中的async/await是什么样的?
又到了周末的code review环节,这次code review发现了一个对async/await的理解问题.让我们直奔主题: var foodsSearch = new FoodSearchSer ...
- 8张图让你一步步看清 async/await 和 promise 的执行顺序
摘要: 面试必问 原文:8张图帮你一步步看清 async/await 和 promise 的执行顺序 作者:ziwei3749 Fundebug经授权转载,版权归原作者所有. 为什么写这篇文章? 说实 ...
- 8 张图帮你一步步看清 async/await 和 promise 的执行顺序(转)
https://mp.weixin.qq.com/s?__biz=MzAxODE2MjM1MA==&mid=2651555491&idx=1&sn=73779f84c289d9 ...
随机推荐
- VScode连接服务器不用每次都输入密码
VScode连接服务器不用每次都输入密码. 用git或xcode的ssh keygen生成一组不带密码的 rsa2048 的公钥id_rsa_nopasswd.pub和私钥id_rsa_nopassw ...
- Linux Driver : gpio-keys
Linux Driver : gpio-keys的解析 背景 在阅读高通设备树配置一个按键的时候,没有找到按键是在什么时候进行处理的.因此根据仅有的线索gpio-key.c进行分析,发现根据之前的学习 ...
- openfoam 修改 src 库经验记录
遇到一个问题,要把 sprayFoam 求解器的蒸发模型修改为自定义蒸发模型. sprayFoam 求解器本身没有实现蒸发模型,而是调用 $FOAM_SRC/lagrangian/intermedia ...
- Linux的访问权限详解
题目 解读访问权限 rw-r--r--分别代表什么东西 r:代表可读 w:可写 e:可执行 方便起见进行拆分 rw- 代表文件所属用户的权限 r-- 代表同组用户的权限 r-- 代表其他用户的权限 同 ...
- Springboot整合Apollo
一.Apollo作用 随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关.参数的配置.服务器的地址-- 对程序配置的期望值也越来越高:配置修改后实时生效,灰度发布,分环境.分集群管理配置,完善 ...
- 分布式文件系统 FastDFS 整理
1.FastDFS 1.1.了解基础概念 1.1.1.什么是分布式文件系统? 全称:Distributed File System,即简称的DFS 这个东西可以是一个软件,也可以说是服务器,和tomc ...
- SSM中Mybatis的配置
注:数据库连接(此过程不当做本次笔记重点,只做简单概述) 1.创建并配置jdbc.properties文件 2.通过Druid连接池配置连接数据库 3.将数据源(dataSource)注入IOC 详细 ...
- 树莓派安装OpenCv
树莓派安装OpenCv 更换树莓派软件源 我们选择将树莓派的软件源切换到清华大学镜像站,据笔者亲测,通过此站可以顺利安装openCV. 切换软件源需要修改两个软件源配置文件的内容. 第一个需要修改是「 ...
- 设置Docker容器里的时间
启动容器时,添加环境变量 docer run -e TZ=Asia/Shanghai --rm myalpine date -e TZ=Asia/Shanghai
- VPS测试脚本,网络线路,路由测试,流媒体服务器测试脚本
收集了一些服务器测试脚本,测试性能,网络以及解锁Netflix等服务.记录收集一下,特此记录. yabs测试脚本wget -qO- yabs.sh | bash 老外比较爱用的服务器性能测试脚本. ...