C# 学习async/await(个人理解)

时间:2023-02-09 17:10:51

await : 等待的意思

async:异步(非同步)

 

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

 

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

C# 学习async/await(个人理解)

 

 

 

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

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

C# 学习async/await(个人理解)

 

 

 

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

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

 

 C# 学习async/await(个人理解)

 

 

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

C# 学习async/await(个人理解)

 

 

 

四、async Task 和async Void的区别?

很简单~  Task任务嘛

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

C# 学习async/await(个人理解)

 

 

 

第五步:总结

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