这段时间在项目开发中看到了一些async/await的使用,在aspnet core的host组件源码中也看到了许多的async/await代码。在开发时,正确的使用了async/await是可以提高程序的性能。下面的代码教你正确的理解await关键字的暂停/阻塞方法调用:

static void Main(string[] args)
{
Console.WriteLine("-------主线程启动-------");
var task = GetStrLengthAsync();
Console.WriteLine("主线程继续执行");
Console.WriteLine("Task返回的值: " + task.Result);
Console.WriteLine("-------主线程结束-------"); Console.Read();
} static async Task<string> GetStrLengthAsync()
{
Console.WriteLine("GetStrLengthAsync方法开始执行"); var str = await GetString();
Console.WriteLine("GetString方法调用结束"); var str1 =await GetStringOne();
Console.WriteLine("GetStringOne方法调用结束"); Console.WriteLine("GetStrLengthAsync方法执行结束");
return str + " ###### " + str1;
}      ///await关键字会暂停/阻塞其所在的方法,返回调用 await关键字所在的方法处 继续执行,而不是接着await关键字所在的代码处往下执行,注释下面的代码,查看运行结果即可确认。

      //static async Task<string> GetStrLengthAsync()
      //{
      // Console.WriteLine("GetStrLengthAsync方法开始执行");


      // var str = GetString();
      // Console.WriteLine("GetString方法调用结束");


      // var str1 = GetStringOne();
      // Console.WriteLine("GetStringOne方法调用结束");


      // Console.WriteLine("GetStrLengthAsync方法执行结束");
      // return await str + " ###### " + await str1;
      //}

static async Task<string> GetString()
{
Console.WriteLine("GetString方法开始执行");
return await Task.Run(() =>
{
Thread.Sleep();
return "GetString的返回值";
});
} static async Task<string> GetStringOne()
{
Console.WriteLine("GetStringOne方法开始执行");
return await Task.Run(() =>
{
Thread.Sleep();
return "GetStringOne的返回值";
});
}

await关键字会阻塞/暂停它所在的方法。根据结果即可判断:

        //主线程启动
//GetStrLengthAsync方法开始执行
//GetString方法开始执行
//主线程继续执行
//GetString方法调用结束
//GetStringOne方法开始执行
//GetStringOne方法调用结束
//GetStrLengthAsync方法执行结束
//Task返回的值:
//主线程结束 //主线程启动
//GetStrLengthAsync方法开始执行
//GetString方法开始执行
//GetString方法调用结束
//GetStringOne方法开始执行
//GetStringOne方法调用结束
//GetStrLengthAsync方法执行结束
//主线程继续执行
//Task返回的值:
//主线程结束

教你正确打开async/await关键字的使用的更多相关文章

  1. 异步编程Async/await关键字

    异步编程Async \await 关键字在各编程语言中的发展(出现)纪实. 时间 语言版本 2012.08.15 C#5.0(VS2012) 2015.09.13 Python 3.5 2016.03 ...

  2. .net 异步编程async & await关键字的思考

    C# 5.0引入了两个关键字 async和await,这两个关键字在很大程度上帮助我们简化了异步编程的实现代码,而且TPL中的task与async和await有很大的关系 思考了一下异步编程中的asy ...

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

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

  4. 为什么我们要使用Async、Await关键字

    前不久,在工作中由于默认(xihuan)使用Async.Await关键字受到了很多质问,所以由此引发这篇博文“为什么我们要用Async/Await关键字”,请听下面分解: Async/Await关键字 ...

  5. async/await 实现协程

    2. 基本了解 在了解异步协程之前,我们首先得了解一些基础概念,如阻塞和非阻塞.同步和异步.多进程和协程. 2.1 阻塞 阻塞状态指程序未得到所需计算资源时被挂起的状态.程序在等待某个操作完成期间,自 ...

  6. 温故知新,CSharp遇见异步编程(Async/Await),聊聊异步编程最佳做法

    什么是异步编程(Async/Await) Async/Await本质上是通过编译器实现的语法糖,它让我们能够轻松的写出简洁.易懂.易维护的异步代码. Async/Await是C# 5引入的关键字,用以 ...

  7. 关于异步执行(Async/await)的理解(转发)

    原文地址: http://blog.jobbole.com/85787/ 同步编程与异步编程 通常情况下,我们写的C#代码就是同步的,运行在同一个线程中,从程序的第一行代码到最后一句代码顺序执行.而异 ...

  8. Python协程:从yield/send到async/await

    这个文章理好了脉落. http://python.jobbole.com/86069/ 我练 习了一番,感受好了很多... Python由于众所周知的GIL的原因,导致其线程无法发挥多核的并行计算能力 ...

  9. async/await 异步编程(转载)

    转载地址:http://www.cnblogs.com/teroy/p/4015461.html 前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入 ...

随机推荐

  1. 使用js获取页面参数

    方法一 function GetUrlParam (name) { return decodeURIComponent((new RegExp('[?|&]' + name + '=' + ' ...

  2. luoguP4841 城市规划

    题意: 求n个点的无相连通图的个数.有编号 思路一: 黏博客 至于为什么除以k!:(没有博客中说的那么简单) 实际上, 对于一个n的用k个自然数的拆分,每一个拆分的贡献是: $\frac{n!*\Pi ...

  3. django系列4 :创建管理员

    以下复制粘贴自官网 创建管理员用户¶ 首先,我们需要创建一个可以登录管理站点的用户.运行以下命令: /  $ python manage.py createsuperuser 输入所需的用户名, ...

  4. 2018-2019-2 20175209 实验一《Java开发环境的熟悉》实验报告

    2018-2019-2 20175209 实验一<Java开发环境的熟悉>实验报告 一.实验内容及步骤 1.使用JDK编译.运行简单的Java程序 cd 20175209进入2017520 ...

  5. tensorflow Method源码阅读之 fully_connected

    https://www.tensorflow.org/api_docs/python/tf/contrib/layers/fully_connected fully_connected: 1.先根据权 ...

  6. 优秀的电商平台Jshop栗子

    摘录自:https://blog.csdn.net/chenjun9205/article/details/52412503 下载源代码 git clone https://git.oschina.n ...

  7. NOI-OJ 1.12 ID:10 素数对

    整体思路 本题涉及大量素数的使用,故使用埃拉拖色尼算法提前计算出素数表可以避免大量.重复的计算. 判断素数对很简单,使用两个变量p1和p2代表素数表中的第一个和第二个素数,依次在表中向后移动,判断p2 ...

  8. 第六节:反射(几种写法、好处和弊端、利用反射实现IOC)

    一. 加载dll,读取相关信息 1. 加载程序集的三种方式 调用Assembly类下的三个方法:Load.LoadFile.LoadFrom. //1.1 Load方法:动态默认加载当前路径下的(bi ...

  9. 清除Windows访问共享时保存的凭据记录

    场景:某些时候我们连接了某台PC或服务器的共享目录或打印机,但因为一些原因突然连接不上了(或是对方组策略发生变化,或是对方计算机用户密码变更 等等..) 又或者电脑给其它用户使用,因一些安全问题需要临 ...

  10. js实现可输入的下拉框

    <HTML> <HEAD> <META http-equiv='Content-Type' content='text/html; charset=gb2312'> ...