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下面的代码()
用途:
以下是编写代码前应考虑的两个问题:
-
你的代码是否会“等待”某些内容,例如数据库中的数据?
如果答案为“是”,则你的工作是 I/O 绑定。 (则使用async await 而不是Task.run)
-
你的代码是否要执行开销巨大的计算?
如果答案为“是”,则你的工作是 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