首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

async await 状态机理解

编程知识
2024年08月20日 22:04
 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

由于TestClassWait3S方法是一个异步方法,里面的

 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")只会输出一次)。
 


 
From:https://www.cnblogs.com/daiwk/p/18370527
本文地址: http://www.shuzixingkong.net/article/1283
0评论
提交 加载更多评论
其他文章 Java微信授权登录小程序接口
1.微信授权登录小程序的流程是什么 微信授权登录小程序的流程是一个涉及前端和后端交互的过程,主要目的是让用户能够使用微信账号快速登录小程序,避免重复输入用户名和密码。以下是该流程的详细步骤: 1.1前端操作 (1)触发登录: 用户在小程序中点击“登录”按钮或进入需要登录的页面时,系统会自动弹出授权登
RabbitMQ 基础概念与架构设计及工作机制学习总结
什么是RabbitMQ MQ全称为Message Queue,即消息队列. 它也是一个队列,遵循FIFO原则 。RabbitMQ则是一个开源的消息中间件,由erlang语言开发,基于AMQP协议实现的一个软件产品,提供应用程序之间的通信方法,在分布式系统开发中广泛应用。 AMQP协议 AMQP,即A
RabbitMQ 基础概念与架构设计及工作机制学习总结 RabbitMQ 基础概念与架构设计及工作机制学习总结 RabbitMQ 基础概念与架构设计及工作机制学习总结
WPF:静态、动态资源以及资源词典
WPF:静态、动态资源以及资源词典 静态资源与动态资源 我们常常会使用样式或者控件模板放在Window.Resources中,比如这样: 静态资源与动态资源使用如下: &lt;Window.Resources&gt; &lt;SolidColorBrush x:Key=&quot;SolidColo
WPF:静态、动态资源以及资源词典 WPF:静态、动态资源以及资源词典 WPF:静态、动态资源以及资源词典
代码随想录Day21
669. 修剪二叉搜索树 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答
Volatile关键字
背景 volatile关键字是并发编程中的一个比较重要的关键字。它能保证变量/对象在内存中的可见性,同时禁止指令重排序,避免了CPU或者编译器优化带来的可见性问题。 在并发编程中,volatile可以去修饰一个变量,或者是一个对象(比如单例模式中就使用了volatile去修饰单例对象) 举例说明 v
BST 二叉搜索树 BinarySearchTree C++实现(递归/非递归)
目录二叉搜索树基本概念常用结论用途二叉搜索树的性能分析二叉搜索树的操作查找插入删除代码实现BSTree.hpptest.cc 二叉搜索树 基本概念 二叉搜索树(BST,Binary Search Tree) 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空
BST 二叉搜索树 BinarySearchTree C++实现(递归/非递归) BST 二叉搜索树 BinarySearchTree C++实现(递归/非递归) BST 二叉搜索树 BinarySearchTree C++实现(递归/非递归)
变分信息瓶颈 (Variational Information Bottleneck) 公式推导
互信息 互信息用于表示两个随机变量相互依赖的程度。随机变量 \(X\) 和 \(Y\) 的互信息定义为 \[\begin{aligned} I(X, Y) &amp; = \mathrm{KL}[p(\boldsymbol{x}, \boldsymbol{y}) \parallel p(\bolds
变分信息瓶颈 (Variational Information Bottleneck) 公式推导
[rCore学习笔记 025]分时多任务系统与抢占式调度
写在前面 本随笔是非常菜的菜鸡写的。如有问题请及时提出。 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 本节重点 本章最开始的时候讲解了有类似于多道程序与协作式调度的区别. 回想上一节,我们提到的,如果我们仍然
[rCore学习笔记 025]分时多任务系统与抢占式调度