教你正确打开async/await关键字的使用
这段时间在项目开发中看到了一些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关键字的使用的更多相关文章
- 异步编程Async/await关键字
异步编程Async \await 关键字在各编程语言中的发展(出现)纪实. 时间 语言版本 2012.08.15 C#5.0(VS2012) 2015.09.13 Python 3.5 2016.03 ...
- .net 异步编程async & await关键字的思考
C# 5.0引入了两个关键字 async和await,这两个关键字在很大程度上帮助我们简化了异步编程的实现代码,而且TPL中的task与async和await有很大的关系 思考了一下异步编程中的asy ...
- .Net异步关键字async/await的最终理解
由于之前的项目中自己突然想试试异步action,于是使用了一下,突然就对异步action的执行流程以及原理及其好处产生了兴趣,再参考了一些文章之后,就做了下归类. 我们可以不需要太深入的理解底层,但是 ...
- 为什么我们要使用Async、Await关键字
前不久,在工作中由于默认(xihuan)使用Async.Await关键字受到了很多质问,所以由此引发这篇博文“为什么我们要用Async/Await关键字”,请听下面分解: Async/Await关键字 ...
- async/await 实现协程
2. 基本了解 在了解异步协程之前,我们首先得了解一些基础概念,如阻塞和非阻塞.同步和异步.多进程和协程. 2.1 阻塞 阻塞状态指程序未得到所需计算资源时被挂起的状态.程序在等待某个操作完成期间,自 ...
- 温故知新,CSharp遇见异步编程(Async/Await),聊聊异步编程最佳做法
什么是异步编程(Async/Await) Async/Await本质上是通过编译器实现的语法糖,它让我们能够轻松的写出简洁.易懂.易维护的异步代码. Async/Await是C# 5引入的关键字,用以 ...
- 关于异步执行(Async/await)的理解(转发)
原文地址: http://blog.jobbole.com/85787/ 同步编程与异步编程 通常情况下,我们写的C#代码就是同步的,运行在同一个线程中,从程序的第一行代码到最后一句代码顺序执行.而异 ...
- Python协程:从yield/send到async/await
这个文章理好了脉落. http://python.jobbole.com/86069/ 我练 习了一番,感受好了很多... Python由于众所周知的GIL的原因,导致其线程无法发挥多核的并行计算能力 ...
- async/await 异步编程(转载)
转载地址:http://www.cnblogs.com/teroy/p/4015461.html 前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入 ...
随机推荐
- HDU 5984(求木棒切割期望 数学)
题意是给定一长为 L 的木棒,每次任意切去一部分直到剩余部分的长度不超过 D,求切割次数的期望. 若木棒初始长度不超过 D,则期望是 0.000000: 设切割长度为 X 的木棒切割次数的期望是 F( ...
- C#利用VUDP.cs开发网络通讯应用例程
VClassLib-CS项目Github地址:https://github.com/velscode/VClassLib-CS VUDP文档地址:https://github.com/velscode ...
- 网络流Dinic(本篇介绍最大流)
前言:看到网上Dinic和ISAP的比较,多数人认为ISAP更快,不容易爆栈.当然,也有少数人认为,在多数情况下,Dinic比较稳定.我认为Dinic的思路比ISAP更简明,所以选择了Dinc算法 介 ...
- (五)Java工程化--Jenkins
Jenkins简介 Jenkins 是一种用Java语言实现的持续集成工具,Jenkins是一个平台, 在此基础上实现下面两个目的. CI 持续集成(Continous Integration) CD ...
- DQL、DML、DDL、DCL区别
DQL(data query language)数据查询语言 主要是由SELECT构成的查询语句 基本语法:select 字段名 from 表名 where 查询条件 DML(data manipul ...
- sql优化------查询整个表按照某个字段排序后的前几条
后续补充
- 让你爱不释手的 Python 模块
 一. logzero 在一个完整的信息系统里面,日志系统是一个非常重要的功能组成部分.它可以记录下系统所产生的所有行为.我们可以使用日志系统所记录的信息为系统进行排错,优化系统的性能,或者根据这些 ...
- 用Python进行SQLite数据库操作
简单的介绍 SQLite数据库是一款非常小巧的嵌入式开源数据库软件,也就是说没有独立的维护进程,所有的维护都来自于程序本身.它是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经 ...
- C语言可重入函数和不可重入函数
可重入函数和不可重入函数的概念 在函数中如果我们使用静态变量了,导致产生中断调用别的函数的 过程中可能还会调用这个函数,于是原来的 静态变量被在这里改变了,然后返回主体函数,用着的那个静态变量就被改变 ...
- ubuntu 16.04扩充root 分区
ubuntu使用过程中,提示root分区剩余空间不足,剩余200多M时还可以进行一些操作,剩余几M时拷贝等命令都不能够执行. 扩充root分区步骤如下: 1.查看root分区所在位置: 命令: sud ...