2

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

 1 year ago
source link: https://www.cnblogs.com/jiaozai891/p/17104853.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

await : 等待的意思

async:异步(非同步)

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

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

2288976-20230209091016330-1863878942.png

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

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

2288976-20230209091205081-2036849215.png

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

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

 

2288976-20230209093356532-2035886245.png

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

2288976-20230209093638724-569543130.png

四、async Task 和async Void的区别?

很简单~  Task任务嘛

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

2288976-20230209103505775-86348474.png

第五步:总结

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


Recommend

  • 124
    • 微信 mp.weixin.qq.com 6 years ago
    • Cache

    浅谈Async/Await

    在很长一段时间里面,FE们不得不依靠回调来处理异步代码。使用回调的结果是,代码变得很纠结,不便于理解与维护,值得庆幸的是Promise带来了.then(),让代码变得井然有序,便于管理。于是我们大量使用,代替了原来的回调方式。但是不存在一种方法可以让当前的执行流...

  • 72
    • beckjin.com 6 years ago
    • Cache

    ASP.NET 谨用 async/await

    ASP.NET 谨用 async/await

  • 73

    C# 5.0 引入 async/await 关键字,旨在简化异步编程模型,抛去语法糖就是 Net4.0 的 Task + 状态机。其实在处理异步编程使用 Task 还是挺简单的,不过既然推出了新的语法糖,难免会尝试一下,然而在使用中却没想象中那么单纯。以下针对ASP.NET 应用程序实际使用过...

  • 77
    • start.jcolemorrison.com 6 years ago
    • Cache

    5 Tips and Thoughts on Async / Await Functions

    So I finally hopped on the boat with usa...

  • 38
    • www.tuicool.com 6 years ago
    • Cache

    Async and Await in Rust: a full proposal

    I’m really excited to announce the culmination of much of our work over the last four months: a pair of RFCs for supporting async & await notation in Rust. This will be very impactful for Rust in the network services...

  • 67

    Node.js express.js MongoDB JWT REST API - Basic Project Skeleton Getting started This is a basic API REST skeleton written on JavaScript using async/await. Great for building an MVP for your front-en...

  • 55
    • manjusaka.itscoder.com 5 years ago
    • Cache

    去 async/await 之路

    看到彭总写的文章 这破 Python ,感慨颇多,我也来灌水吧。 首先,我司算是在国内比较敢于尝试新东西的公司吧,最直接的提现就在于我们会及时跟进社区相关基础服务的迭代...

  • 49
    • 掘金 juejin.im 5 years ago
    • Cache

    理解 async/await

    什么是async? 现在面对日常工作时,总避免不了面对异步操作带来的一些麻烦。在时代演变的过程中,处理异步的方法有许多种:回调函数、Promise 链式语法、Generator 函数到现在比较流行的 async 函数。那什么是 async 呢? async

  • 14

    Dart学习笔记(八):异步支持与async/await 作者: RuphiLau 时间: July 4, 2019 分类:

  • 5

    Swift并发编程 - 理解 async 和 await 原创  2023-06-30  本文是我学习 Swift 并发编程的第一篇笔记,文章从几个不太好理解的点,介绍了async 和 await 语法关键字的使用方法和内在含义。 async 使用 async 修...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK