C#语法——await与async的正确打开方式

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

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

 正确的打开方式

 

首先看下使用约束。

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

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

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

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

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

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

640?wx_fmt=png

 async Task<int>等于int

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

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

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

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

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

640?wx_fmt=png

640?wx_fmt=png

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

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

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

640?wx_fmt=png

640?wx_fmt=png  

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

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

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

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

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

640?wx_fmt=png

640?wx_fmt=png

 

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

640?wx_fmt=png

640?wx_fmt=png

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

 结语

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

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

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

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

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320808.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

好代码是管出来的——.Net Core集成测试与数据驱动测试

软件的单元测试关注是的软件最小可执行单元是否能够正常执行&#xff0c;但是软件是由一个个最小执行单元组成的集合体&#xff0c;单元与单元之间存在着种种依赖或联系&#xff0c;所以在软件开发时仅仅确保最小单元的正确往往是不够的&#xff0c;为了保证软件能够正确运行&a…

【高精】【快速幂】穿越丛林(ssl 2314)

穿越丛林 ssl 2314 题目大意&#xff1a; 求2n2^n2n 原题&#xff1a; 题目描述&#xff1a; ljj 是一位富有冒险心又很喜欢研究数学的孩纸&#xff0c;有一天&#xff0c;他到一个丛林冒险&#xff0c;这里的树长有像0、4、6、8、9这样形状的洞&#xff0c;他要想穿过丛…

谈谈surging引擎的tcp、http、ws协议和如何容器化部署

1、前言分布式已经成为了当前最热门的话题&#xff0c;分布式框架也百花齐放&#xff0c;群雄逐鹿。从中心化服务治理框架&#xff0c;到去中心化分布式服务框架&#xff0c;再到分布式微服务引擎&#xff0c;这都是通过技术不断积累改进而形成的结果。esb,网关&#xff0c;ngi…

Helm - Kubernetes服务编排的利器

Helm介绍在Kubernetes中部署容器云应用&#xff08;容器或微服务编排&#xff09;是一项有挑战性的工作&#xff0c;Helm就是为了简化在Kubernetes中安装部署容器云应用的一个客户端工具。通过Helm能够帮助开发者定义、安装和升级Kubernetes中的容器云应用。同时&#xff0c;也…

.NET Core微服务之基于MassTransit实现数据最终一致性(Part 1)

一、预备知识&#xff1a;数据一致性关于数据一致性的文章&#xff0c;园子里已经有很多了&#xff0c;如果你还不了解&#xff0c;那么可以通过以下的几篇文章去快速地了解了解&#xff0c;有个感性认识即可。&#xff08;1&#xff09;左正&#xff0c;《保证分布式系统数据一…

Asp.NetCoreWebApi图片上传接口(二)集成IdentityServer4授权访问(附源码)

写在前面本文地址&#xff1a;http://www.cnblogs.com/yilezhu/p/9315644.html作者&#xff1a;yilezhu上一篇关于Asp.Net Core Web Api图片上传的文章使用的是mongoDB进行图片的存储&#xff0c;文章发布后&#xff0c;张队就来了一句&#xff0c;说没有使用GridFS。的确博主只…

.NET Core开发日志——从ASP.NET Core Module到KestrelServer

ASP.NET Core程序现在变得如同控制台(Console)程序一般&#xff0c;同样通过Main方法启动整个应用。而Main方法要做的事情很简单&#xff0c;创建一个WebHostBuilder类&#xff0c;调用其Build方法生成一个WebHost类&#xff0c;最后启动之。实现代码一目了然&#xff1a;要想探…

【bfs】极其简单的最短路问题

极其简单的最短路问题 题目大意&#xff1a; 求最短路&#xff0c;权值只有1或2 原题&#xff1a; 题目描述 小C终于被小X感动了&#xff0c;于是决定与他看电影&#xff0c;然而小X距离电影院非常远&#xff0c;现在假设每条道路需要花费小X的时间为1&#xff0c;由于有数…

GraphQL 的前世今生

GraphQL是什么GraphQL是一种新的API标准&#xff0c;它提供了一种更高效、强大和灵活的数据提供方式。它是由Facebook开发和开源&#xff0c;目前由来自世界各地的大公司和个人维护。GraphQL本质上是一种基于api的查询语言&#xff0c;现在大多数应用程序都需要从服务器中获取数…

C#:如何将坏的代码重新编译为好的代码

自己的前言说明&#xff1a;本文原作者&#xff1a;Radoslaw Sadowski&#xff0c;原文链接为&#xff1a;C# BAD PRACTICES: Learn how to make a good code by bad example。本系列还有其他文章&#xff0c;后续将慢慢翻译。引言&#xff1a;我的名字叫Radoslaw Sadowski&…

走进 Cake for .NET

一、什么是 CakeCake&#xff08;C# Make&#xff09; 是一个使用 C# DSL 面向 Task 的跨平台构建自动化系统&#xff0c;像编译代码&#xff0c;复制文件和文件夹&#xff0c;运行单元测试&#xff0c;压缩文件和构建 NuGet 包。更多内容请访问官网二、使用 Cake先尝试一下 P…

Wannafly挑战赛17

剩下的不太会就没接着打了&#xff0c;没有注意到比赛截至时间&#xff0c;好像提前了几分钟公开题解。意识到的时候已经来不及了。。。抱歉。。。 —————————————————————————————————————— A.走格子 按题意模拟即可 #include <bits/…

【结论】环

环 题目大意&#xff1a; 给出一个环中的三个数&#xff0c;这三个数按输入顺序连接&#xff08;有向&#xff09;&#xff0c;问连接的线是顺时针还是逆时针 原题&#xff1a; 题目描述 有一个圆&#xff0c;1-N共N个数在圆环上顺时针排列着。 现在给你a,b,c三个数&#…

Asp.Net Core 快速邮件队列设计与实现

发送邮件几乎是软件系统中必不可少的功能&#xff0c;在Asp.Net Core 中我们可以使用MailKit发送邮件&#xff0c;MailKit发送邮件比较简单&#xff0c;网上有许多可以参考的文章&#xff0c;但是应该注意附件名长度&#xff0c;和附件名不能出现中文的问题&#xff0c;如果你遇…

.net core redis 驱动推荐,为什么不使用 StackExchange.Redis

前言本人从事 .netcore 转型已两年有余&#xff0c;对 .net core 颇有好感&#xff0c;这一切得益于优秀的语法、框架设计。2006年开始使用 .net 2.0&#xff0c;从 asp.net 到 winform 到 winservice 等等领域开发都些许涉猎。对.net和大多数同胞有着类似的感触&#xff0c;那…

[开源]开放域实体抽取泛用工具 NetCore2.1

开放域实体抽取泛用工具https://github.com/magicdict/FDDC更新时间 2018年7月16日 By 带着兔子去旅行开发这个工具的起源是天池大数据竞赛&#xff0c;FDDC2018金融算法挑战赛02&#xff0d;A股上市公司公告信息抽取。这个比赛是针对金融公告开展的信息抽取比赛。在参赛过程中…

【DP】树塔狂想曲

树塔狂想曲 题目大意&#xff1a; 有一个数字金字塔&#xff0c;让你求出去掉一个点后&#xff0c;从最顶端走到最低端的最大值&#xff08;只能往下或右下走&#xff09; 原题: 题目描述 相信大家都在长训班学过树塔问题&#xff0c;题目很简单求最大化一个三角形数塔从上…

.NET Core开发日志——HttpClientFactory

当需要向某特定URL地址发送HTTP请求并得到相应响应时&#xff0c;通常会用到HttpClient类。该类包含了众多有用的方法&#xff0c;可以满足绝大多数的需求。但是如果对其使用不当时&#xff0c;可能会出现意想不到的事情。博客园官方团队就遇上过这样的问题&#xff0c;国外博主…

【asp.net Core MVC + angular6实战】 - 1. 环境搭建

为什么打算写这些文章&#xff1f;没有为什么&#xff0c;只是为了学习Angular和更了解.Net Core等技术需要用到的技术&#xff1f;后端使用.Net Core 2.1 EF Core 2.1 Mysql 5.7 Identity &#xff08;不知道Identity算不算一个独立的技术点&#xff09;前端主要使用的是An…

微软宣布公开预览Dev Spaces for AKS

微软宣布公开预览面向Azure Kubernetes Services&#xff08;AKS&#xff09;的Dev Spaces&#xff0c;为团队提供了一种快速的Kubernetes迭代开发体验。该版本是继5月份Build 2018大会上Dev Spaces内部预览之后的版本。借助这个版本&#xff0c;微软希望为开发人员提供一种在A…