C#5.0推出了新语法,await与async,但相信大家还是很少使用它们。关于await与async有很多文章讲解,但有没有这样一种感觉,你看完后,总感觉这东西很不错,但用的时候,总是想不起来,或者不知道该怎么用。

为什么呢?我觉得大家的await与async的打开方式不正确。

正确的打开方式

首先看下使用约束。

1、await 只能在标记了async的函数内使用。

2、await 等待的函数必须标记async。

有没有感觉这是个循环?没错,这就是个循环。这也就是为什么大家不怎么用他们的原因。这个循环很讨厌,那么怎么破除这个循环呢?

【很简单,await等待的是线程,不是函数。】

不理解吗?没关系,接着看下去。

下面从头来讲解,首先看这么一组对比

async Task<int>等于int

这意味着我们在正常调用这两个函数时,他们是等效的。那么用async Task<int>来修饰int目的是什么呢?

目的是为了让这个方法这样被调用 await AsyncTest(),但直接这样调用,并不会开启线程,那这样费劲的修饰是不是就没什么意义了呢。

当然不是,那什么时候会让 await AsyncTest()有意义呢?

我们接着往下看,修改AsyncTest如下。然后,此时再调用await AsyncTest(),你会神奇的发现,依然没有卵用。。。

Excute方法正常执行,而AsyncTest内运行的线程,自己执行自己的。

别着急,我们稍作调整,在线程后面增加.GetAwaiter().GetResult()。这句话是干什么用的呢?是用来获取线程返回值的。

这个逻辑是这样的,如果想要获取线程返回结果,就自然要等待线程结束。

运行一下,我们将看下面的结果。

  

如图,这样写await AsyncTest();就起作用了。

所以,还是那句话,await等待的是线程,不是函数。

但在图里,我们发现很奇怪的一点,结束Excute也是线程3,而不是线程1。也就是说,Await会对线程进行优化。

下面看下两组代码的对比,让我们就更清楚的了解下Await。

第一组,使用await等待线程。

第二组,使用等待线程结果,等待线程。

可以明确的看到,第二组,线程重新回到了主线程1中,而第一组,已经被优化到了线程4中。

结语

await是一种很便捷的语法,他的确会让代码简洁一些,但他主动优化线程的功能,如果不了解就使用,可能会导致一些奇怪的BUG发生。

这也是官方为什么只提供了await调用服务的例子,因为,在程序内调用,await还是要了解后,再使用,才安全。

原文地址:https://www.cnblogs.com/kiba/p/9292904.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

C#语法——await与async的正确打开方式相关推荐

  1. Console控制台的正确打开方式

    Console控制台的正确打开方式 console对象提供了访问浏览器调试模式的信息到控制台 -- Console对象|-- assert() 如果第一个参数断言为false,则在控制台输出错误信息| ...

  2. python论文参考文献名称_Word的正确打开方式(附毕业论文模板)

       ----点击蓝字关注我呀---- 三年前的我搞毕业设计,第一次接触这玩意儿,一脸懵逼 好在我朱哥搞过大创(还是国家级的),当时给我各种科普单片机的知识 搞大创的好处就是当我们不知道是画机械图还是 ...

  3. opengl 贴图坐标控制_材质贴图正确打开方式

    哈喽,各位观众朋友们好鸭~欢迎来到讲道理画图的地方,我是黄玮宁. 最近呀经常有小伙伴来问我那些不同通道的材质贴图该怎么用,而且频率不是一般的高,所以我觉得有必要来说说这些通道贴图的用法了. 视频版(B ...

  4. 任务队列和异步接口的正确打开方式(.NET Core版本)

    layout: post title: 任务队列和异步接口的正确打开方式(.NET Core版本) category: dotnet core date: 2019-01-12 tags: dotne ...

  5. log python_基于Python log 的正确打开方式

    保存代码到文件:logger.py import os import logbook from logbook.more import ColorizedStderrHandler import sm ...

  6. python四舍五入round_四舍五入就用round( )?Python四舍五入的正确打开方式!

    四舍五入就用round( )?Python四舍五入的正确打开方式! 2018-09-22 21:40 阅读数 4 <>round( )函数简介 菜鸟教程中介绍到,round() 函数作用就 ...

  7. 通过机器学习识别“迪士尼在逃公主”,程序员宠女的正确打开方式!

    到了庆祝的时候了!我们刚刚送走了圣诞老人.现在正等待新年的钟声敲响.所以我想到建立一个很酷的东西(至少我的七岁小公主会觉得)同时学一点机器学习.所以我们要做一个什么? 我借用的我女儿所有迪士尼公主人偶 ...

  8. pytorch单机多卡的正确打开方式 以及可能会遇到的问题和相应的解决方法

    pytorch 单机多卡的正确打开方式 pytorch 使用单机多卡,大体上有两种方式 简单方便的 torch.nn.DataParallel(很 low,但是真的很简单很友好) 使用 torch.d ...

  9. [分布式训练] 单机多卡的正确打开方式:Horovod

    [分布式训练] 单机多卡的正确打开方式:Horovod 转自:https://fyubang.com/2019/07/26/distributed-training4/ 讲完了单机多卡的分布式训练的理 ...

最新文章

  1. 报名丨西山金融科技产业创新论坛邀您参会
  2. IE6/7 BUG 图片不能居中
  3. jquery较验组织机构编码
  4. linux 的 df命令:显示磁盘分区上的可用空间
  5. .NET Framewrok 4.0新增类库
  6. 台式电脑调整屏幕亮度
  7. [文摘20071015]图书目录: 哈佛精粹30条-浓缩哈佛大学领袖培养方案之精华
  8. Linux下创建与解压zip, tar, tar.gz和tar.bz2文件--转 .
  9. android电视开发远程开关机,一种电视电脑一体机及其实现远程开关机控制的方法...
  10. Android网易歌词json接口,网易云音乐api分析
  11. VB制作控件之图片命令按钮➀
  12. 芯片验证学习-设计知识补充学习2-38译码器
  13. PIC单片机汇编指令集合
  14. R语言主成分PCA、因子分析、聚类对地区经济研究分析重庆市经济指标
  15. 微信公众号消息通知(原生)
  16. 模拟楼宇扫光效果(three.js实战12)
  17. 未来低功耗计算机,一种低功耗计算机主板
  18. 《神经科学-探索脑(第2版)》部分笔记
  19. LabVIEW控制Arduino采集电位器电压(基础篇—4)
  20. Linux下NFS配置与tftp配置

热门文章

  1. 可编程交换时代就在这里
  2. gdb可以查询执行文件的宏, 但是查询不了o文件的宏
  3. 新型互联网交换中心促进互联网产业发展,助力信息经济创新
  4. 常用安卓开发技巧汇总
  5. CentOS中vsftp安装、配置、卸载
  6. MFC和Win32之三___CGdiObject类和windows Gdi对象
  7. 网络工程师要如何选择?
  8. HangFire循环作业中作业因执行时间太长未完成新作业开启导致重复数据的问题...
  9. .NET 程序测试 Java 项目 log4j2 是否存在远程代码执行漏洞
  10. Dapper防sql注入,同一条SQL支持多种数据库