走进.NetCore的异步编程 - 探索 async/await

前言:

  这段时间开始用.netcore做公司项目,发现前辈搭的框架通篇运用了异步编程方式,也就是async/await方式,作为一个刚接触的小白,自然不太明白其中原理,最重要的是,这个玩意如果不明白基本原理,随意乱用反而可能会降低性能。所以下定决心准备探索学习下这玩意。我始终相信,只要肯专研,没有什么学不会的东西。

有兴趣爱好一起学习交流netcore相关技术的加群:275080612.另外本人博客:小彪博客  欢迎来交流!

正文:

  1.什么是异步:

  简单来说,正常程序执行是从上到下逐语句执行,这就叫同步,也就是说在我们没接触异步之前,我们写的代码都是同步的。那什么是异步呢?说这个之前,咱们先来考虑一种情况,比如当你写同步程序的时候,你的代码中需要先后执行两个非常耗时间的操作,暂且把这两个操作取名了A 和 B,按照同步的方式,那就必须先执行A 等A执行完(假如耗费时间10秒)然后再执行B(假如耗时15秒),这样总共就耗时25秒。这个时候就有人梦想假如A和B能够同时执行,那么只需要耗时15秒就能够执行完,所以就诞生了异步!没错,这就是异步,所以说人要有梦想,因为梦想说不定就会实现的!

  2.用简单程序来探索异步基本原理:

  1.新建一个.net core 控制台项目(我这里版本是.netCore2.2,跟版本关系不大),代码和运行结果如图:

  分析下:

  1.主程序从上到下执行,先打印了 “主程序开始”,然后遇到了异步方法TestAsync(),此时进入异步方法(注意 这个时候还是同步的),所以打印了 “异步方法开始”。

  2.接着往下走,遇到await,此时表示需要开一个线程去执行await后面的内容,然后主线程立马跳出了该方法继续往下执行,所以打印出了“主线程结束”

  3.此时 开辟的异步线程在sleep 1000毫秒后往下执行 打印出 “异步线程执行”,然后再往下执行这个异步方法剩余的 打印出“异步方法结束”

我相信大家都能看懂,并从以上代码和结果能够了解了异步的基本原理。

  2.接下来我把代码修改一下,把那个异步方法改成有返回值的,代码和运行结果如下图

  仔细阅读上面代码,然后你会发现,打印的结果出乎意料,给人的第一感觉就是:这不是跟同步执行一样的结果吗,这异步有何用?没错,这就是我故意写的例子,从这种例子大家容易发现,异步用的不好等于没用,甚至会降低性能,因为框架遇到async await它会给你生成一些底层异步代码。

  但是,从上面这个例子,告诉了我们,要怎么运用好异步,这才是重点。仔细分析上面这个代码,你会发现主程序调用了异步方法之后,下一句代码就是输出这个异步的结果,问题就在此,编译器运行到这里发现需要输出这个异步结果,但是异步线程还在运行着,所以编译器就停在这里等待,直到异步方法运行结束拿到结果,才继续往下执行。

  这就相当于脱裤子放屁,这个例子运用了异步等于没用,这就告诉我们什么情况下运用异步:

  我的理解是这样的:当你要执行几个耗时操作的时候,你用异步去分别执行这几个操作,这是没问题的,但是你要注意,不要在执行异步操作的下一句代码立马去用它的结果,否则就会造成等待完成,失去异步效果。

  

最后:

  先写到这吧,感谢大家阅读,觉得有用就点个赞哈。由于本人不太习惯在博客园上写文章,平常一般在群里跟大家交流,欢迎大家加入.NetCore交流群:275080612

  

.Net Core异步async/await探索的更多相关文章

  1. C#Framework4.0支持异步async/await语法

    由于用户使用的是XP系统,但是程序里异步都是通过async/await代码来实现的,然而async/await需要Framework4.5版本才可以,而XP系统最高只能支持到Framework4.0, ...

  2. 我也来说说C#中的异步:async/await

    序 最近看了一些园友们写的有关于异步的文章,受益匪浅,写这篇文章的目的是想把自己之前看到的文章做一个总结,同时也希望通过更加通俗易懂的语言让大家了解"异步"编程. 1:什么是异步 ...

  3. Python 进阶 异步async/await

    一,前言 本文将会讲述Python 3.5之后出现的async/await的使用方法,我从上看到一篇不错的博客,自己对其进行了梳理.该文章原地址https://www.cnblogs.com/dhcn ...

  4. 异步 async & await

    1 什么是异步 异步的另外一种含义是计算机多线程的异步处理.与同步处理相对,异步处理不用阻塞当前线程来等待处理完成,而是允许后续操作,直至其它线程将处理完成,并回调通知此线程. 2 异步场景 l  不 ...

  5. 异步async/await简单应用与探究

    感谢Marco CAO指出的两点错误,已做出修改与补充 异步函数(async/await)简单应用 .NET Framework4.5提供了针对异步函数语法糖,简化了编写异步函数的复杂度. 下面通过一 ...

  6. 请教 C# 异步 async await 问题

    各位园友,之前对C#异步只是肤浅了解,请教一个具体问题. 需求: 前台会发送一个Array,这个数组都是 id的集合,比较大.分两步,首先保存这些id,然后去调用异步方法. 可以正常返回json,也可 ...

  7. .Net异步关键字async/await的最终理解

    由于之前的项目中自己突然想试试异步action,于是使用了一下,突然就对异步action的执行流程以及原理及其好处产生了兴趣,再参考了一些文章之后,就做了下归类. 我们可以不需要太深入的理解底层,但是 ...

  8. 已配置好的vue全家桶项目router,vuex,api,axios,vue-ls,async/await,less下载即使用

    github 地址: https://github.com/liangfengbo/vue-cli-project 点击进入 vue-cli-project 已构建配置好的vuejs全家桶项目,统一管 ...

  9. C#扫盲篇(四):.NET Core 的异步编程-只讲干货(async,await,Task)

    关于async,await,task的用法和解释这里就不要说明了,网上一查一大堆.至于为啥还要写这篇文章,主要是其他文章水分太多,不适合新手学习和理解.以下内容纯属个人理解,如果有误,请高手指正.本文 ...

随机推荐

  1. Python List reverse()方法

    reverse() 函数用于反向列表中元素,参数 NA,该方法没有返回值,但是会对列表的元素进行反向排序,原来的列表被改变,生成新的列表. 例子:list1 = ['Google', 'Runoob' ...

  2. [转]A记录和CNAME记录的区别

    1.什么是域名解析? 域名解析就是国际域名或者国内域名以及中文域名等域名申请后做的到IP地址的转换过程.IP地址是网路上标识您站点的数字地址,为了简单好记,采用域名来代替ip地址标识站点地址.域名的解 ...

  3. Python利用itchat库向好友或者公众号发消息

    首先获得好友或者公众号的UserName 1.获取好友UserName #coding=utf8 import itchat itchat.auto_login(hotReload=True) #想给 ...

  4. Asp.net工作流workflow实战之给书签命名(四)

    之前我们的书签名字是通过手动录入的方式,在实际开发中要在流程设计的时候定义好: namespace EazyBPMS.WorkFlow { public sealed class SetStepAct ...

  5. 怎样在win7中 安装Tomcat7.0

    Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器. 我们可以到官方网站下载Tomcat7 工具/原料 win7 Tomcat7.0 方法/步骤 1 在官网下载软件: ...

  6. 2016.4.6 WinForm显示PDF两种方法

    1.最直接的方法,添加webbrowser控件 webb.Url = new Uri(path);可显示pdf控件. 如果需要在打开时跳转到某页,可用在路径后直接加#page=,例如webb.Url ...

  7. ping 127.0.0.1请求超时的解决办法?

    转自:http://blog.51cto.com/dengyong/1429699 打开网络连接,你很有可能启用了虚拟wifi.若有无线网卡就把无线网卡关掉,然后本地连接那里(就是有线网卡的那个连接) ...

  8. docker 笔记(4) Dockerfile 常用的指令

    下面列出了 Dockerfile 中最常用的指令,完整列表和说明可参看官方文档. FROM指定 base 镜像. MAINTAINER设置镜像的作者,可以是任意字符串. COPY将文件从 build ...

  9. struct-config.xml配置文件的解析

    //定义了xml文件的版本和编码<?xml version="1.0" encoding="UTF-8"?>//配置文件中的元素必须按照下述doc指 ...

  10. Linux reboot后数据库无法自动启动

    需将以下由N改为Y orcl:/data/oracle_db/product/13.2.0/db_1:Y Last login: Thu Aug 27 16:36:19 2015 from 10.10 ...