首页 > 编程语言 >C# 学习async/await(个人理解)

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

时间:2023-02-09 12:34:42浏览次数:53  
标签:异步 Task C# await 线程 async 执行

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

 

 

 

 

 

 

 

 

 

TRANSLATE with x English
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian  
  TRANSLATE with COPY THE URL BELOW Back EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back

标签:异步,Task,C#,await,线程,async,执行
From: https://www.cnblogs.com/jiaozai891/p/17104853.html

相关文章

  • CSS 3.0实现的悬停菜单特效
    今天给大家分享一个用CSS3.0实现的悬停菜单特效,效果如下:以下是代码实现,欢迎大家复制粘贴和收藏。<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><m......
  • CSS 3.0扭曲实现的滚动倾斜背景特效
    今天给大家分享一个用CSS3.0扭曲实现的滚动倾斜背景特效,效果如下: 以下是代码实现,欢迎大家复制粘贴和收藏。<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF......
  • elasticsearch使用painless的一些简单例子
    目录1、背景2、准备数据2.1mapping2.2插入数据3、例子3.1(update)更新文档id=1的文档,将age加2岁3.2(update_by_query)如果province是北京的话,就将age减少1岁3......
  • CSS 3.0实现瀑布流布局
    瀑布流布局是网页中常见的布局效果,一般我们都是用JS实现的,其实用CSS3.0的属性也可以实现这个功能,并且还自带了响应式功能,效果如下 : 以下是代码实现,欢迎大家复制粘贴和收......
  • Edu Codeforces Round 142 (Rated for Div. 2)-D. Fixed Prefix Permutations-置换、
    题目:https://codeforces.com/problemset/problem/1792/D非常套路地,\(q_{p_j}\)看成映射就是\((p*q)(j)\),双射自然可逆,所以改成\(q(j)=p^{-1}(j)\)。题目里的每个置换长......
  • CSS 3.0中的混合模式的妙用
    给大家分享一个用CSS3.0的混合模式实现的特效,不用给文字设置多种颜色,滚动页面时,能够让文字能够根据背景颜色自动发生改变,效果如下:以下是代码实现,欢迎大家复制粘贴和收藏。<......
  • CSS 3.0中裁剪图像的特效
    在有CSS3.0之前裁剪图片实现也是颇有难度的,现在我们有了两个非常方便简单的属性可以实现裁剪,那就是object-fit和obectj-position,这两个属性可以让我们改变图片的大小,但是......
  • CSS 3.0中伪元素after和before的妙用
    我们常用CSS3.0中的伪元素来修饰一些细节,让页面看起来效果更好,比如下面这个图片中的面包屑导航中的符号,还有任务清单前的序列符号,都是用伪元素实现的。 以下是代码实现,希......
  • CSS 3.0中图片颜色过滤特效
    给大家分享一个用CSS3.0写的图片颜色过滤的特效,效果如下:以下是代码实现,欢迎大家复制粘贴和收藏。<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><m......
  • CSS 3.0的过滤属性实现黑暗模式
    现在很多的网站都喜欢采用黑暗模式,毕竟这种界面看起来逼格比较高端,比如下面这样的效果:你可能会认为这是不是需要写两套样式,其实不用,用一个属性就可以变成黑暗模式,以下是代码......