await : 等待的意思

async:异步(非同步)

当我们方法内部   存在await的时候,就返回出去 执行下一步 ,等await后面的方法执行完毕 在执行await下面的方法

一、我们先看正常的同步操作:

二、加async await异步操作(也就是说 在执行标记async 的方法 DoWorkAsync 方法的时候 如果 内部有await 则return出去 执行调用DoWorkAsync的下一步 .等待await 方法()执行完毕 ,则进入DoWorkAsync方法里执行下一步)

注意:async await并不会新开线程

三、返回值为Task<T> 很好理解 异步有返回值   有人说你这里为什么顺序执行,还记得第一步说的呢 await就会return出去 我的下面是一个readline 所以会阻塞线程

什么意思? 也就是说使用await 并不会一定执行异步~ 正如我们第一点所说 await 不开启新的线程

如果我们取消了await   可以看到  在我们的内部DoWorkAsync 是异步执行,因为有返回值 所以我们的第三步输出,第五步拿到返回值才会输出出来

四、async Task 和async Void的区别?

很简单~  Task任务嘛

如果你想获取到DoWorkAsync的任务执行情况,那就返回Task 如果你只是想异步执行,而不关心DoWorkAsync的任务完成情况 可以使用void  一般用于事件处理程序 尽量不要在其他方法使用(有可能存在报错 异常)

第五步:总结

1.async await 并不开启新的线程

2.async await并不一定是异步执行(主线程阻塞,线程池没有线程 就会同步执行,否则则异步执行)

3.遇到await 我们就要想到return出去 往下面走  await 方法()   等待该方法的完成

在简单点 await就是  遇到了 挂起该操作(注意挂起的不是await 而是async的方法  挂起时候释放当前线程) 不往下面执行,等待 await 后面的 方法()执行完毕  在执行await下面的代码()

用途:

      以下是编写代码前应考虑的两个问题:

  1. 你的代码是否会“等待”某些内容,例如数据库中的数据?

    如果答案为“是”,则你的工作是 I/O 绑定。     (则使用async await 而不是Task.run)

  2. 你的代码是否要执行开销巨大的计算?

    如果答案为“是”,则你的工作是 CPU 绑定,并且你重视响应能力  请使用 async 和 await,但在另一个线程上使用 Task.Run 生成工作

所以个人理解 :当你去要做某事的时候   await就是让你做出改变的事情,比如你最终目的是蒸米把米放入碗中   当你准备蒸米,洗米放入锅中加工的时候  await 做出改变  这个时候你可以去洗菜 当你米蒸好了 打开锅盖 放入碗中  结束 

(个人 也就是 你是单线程的)

在理解下哦   

同步:    蒸米(20分钟)------洗水果(10分钟)---洗菜(10分钟)-----炒菜(20分钟) -----(共计60分钟)

异步: 蒸米(20分钟)----await做出改变(洗水果) --------洗菜(10分钟)-----炒菜(20分钟) -----(共计50分钟)

压缩异步: 蒸米(20分钟)----await做出改变(洗水果----await做出改变 洗菜)-----炒菜(20分钟) -----(共计40分钟)

 补充:Task.Run 不一定启动新的线程 ,取决于当前线程池的数量 ,和任务状态

如果一定要 启动新的线程 Task.Factory.StartNew使用这个 

简单的模型

使用 Async和 Await 的任务异步编程 (TAP) 模型 (C#) | Microsoft Learn

C# 学习async/await(个人理解)的更多相关文章

  1. async/await 深度理解使用

    在vue中使用 eg async created () { await setTimeout(()=>{ console.log(1) },5000); }, async mounted () ...

  2. JavaScript基础——深入学习async/await

    本文由云+社区发表 本篇文章,小编将和大家一起学习异步编程的未来--async/await,它会打破你对上篇文章Promise的认知,竟然异步代码还能这么写! 但是别太得意,你需要深入理解Promis ...

  3. 初步学习async/await,Task.GetAwaiter,Task.Result

    网上关于async/await的知识有很多,看了很多但不如自己实践一遍来得快,所以这里记录下我的理解和大家学习下. 首先以最简单的同步方法来开始如下 private static void Test( ...

  4. 关于异步执行(Async/await)的理解(转发)

    原文地址: http://blog.jobbole.com/85787/ 同步编程与异步编程 通常情况下,我们写的C#代码就是同步的,运行在同一个线程中,从程序的第一行代码到最后一句代码顺序执行.而异 ...

  5. 七 vue学习 async/await

    1:  javaScript async/await: 调用async函数的时候,是异步的,函数后面的代码继续执行.! async / await是ES7的重要特性之一,也是目前社区里公认的优秀异步解 ...

  6. async/await 的理解

    1.如果一个方法标记了 async 关键字,那么这个方法被调用时就是异步执行: 2.利用Task运行一个任务,这个任务里的函数也是异步执行: 3.如果一个任务前被标记await,那么等待这个任务执行完 ...

  7. async/await到底该怎么用?如何理解多线程与异步之间的关系?

    前言 如标题所诉,本文主要是解决是什么,怎么用的问题,然后会说明为什么这么用.因为我发现很多萌新都会对之类的问题产生疑惑,包括我最初的我,网络上的博客大多知识零散,刚开始看相关博文的时候,就这样.然后 ...

  8. 理解C#中的 async await

    前言 一个老掉牙的话题,园子里的相关优秀文章已经有很多了,我写这篇文章完全是想以自己的思维方式来谈一谈自己的理解.(PS:文中涉及到了大量反编译源码,需要静下心来细细品味) 从简单开始 为了更容易理解 ...

  9. 8张图让你一步步看清 async/await 和 promise 的执行顺序

    摘要: 面试必问 原文:8张图帮你一步步看清 async/await 和 promise 的执行顺序 作者:ziwei3749 Fundebug经授权转载,版权归原作者所有. 为什么写这篇文章? 说实 ...

  10. 8 张图帮你一步步看清 async/await 和 promise 的执行顺序(转)

    https://mp.weixin.qq.com/s?__biz=MzAxODE2MjM1MA==&mid=2651555491&idx=1&sn=73779f84c289d9 ...

随机推荐

  1. 1分钟完成在线测试部署便捷收集班级同学文件的web管理系统

    最近CSDN推出了一个新功能[云IDE],个人对这个新功能(比赛奖金 )挺感兴趣的,于是瞬速地拿之前自己搞的一个便捷收集班级同学文件的web管理系统(下面简称该项目为cfile)体验了一下,发现功能还 ...

  2. onps栈使用说明(1)——API接口手册

    1. 底层API 由协议栈底层提供的api,用于涉及底层操作的一些功能实现,这些api接口函数的原型定义分布于不同的文件,它们被统一include进了onps.h中: open_npstack_loa ...

  3. Prometheus 监测 RocketMQ 最佳实践

    本文作者:郭雨杰,阿里云智能技术专家. Prometheus 集成的 50 多款云产品中,RocketMQ 在可观测方面实现了非常完善的功能,是一个特别具有代表性的云产品. 01 RocketMQ如何 ...

  4. windows10熄屏断网问题解决

    以前用windowsserver的操作系统可以随时随地的远程,最近因工作需要安装了一个windows10的远程设备,发现windows10系统长时间未使用便连不上了,远程不了,ping不通,本地连接断 ...

  5. vcenter的虚拟机开机进入bios

  6. 使用lamdba查询datatable中的一个值或者单元格

    首先创建一个datatable,结构简单的分为两列 Datatable dt=new Datatable(); dt.Columns("code"); dt.Columns(&qu ...

  7. 关于解决linux python3安装gattlib报错

    1. 报错信息 /usr/bin/ld: cannot find -lboost_python36 collect2: error: ld returned 1 exit status error: ...

  8. java 定时开始执行程序

    package com.zx.ps.web.gzdb; import java.util.Calendar; import java.util.Date; import java.util.Timer ...

  9. 【Java SE】Day04 IDEA、方法*

    一.IDEA 1.快捷键 Ctrl+Alt+L/Ctrl+Alt+Shift+4:格式化代码 Alt+Insert:自动生成代码 修改快捷键:File->Settings->keymap- ...

  10. 出现报错:The field admin.LogEntry.user was declared with a lazy reference to 'api.user', but app 'api' isn't installed.解决方法