.NET4.5新特性之异步编程(Async和Await)的使用
一、简介
首先来看看.net的发展中的各个阶段的特性:NET 与C# 的每个版本发布都是有一个“主题”。即:C#1.0托管代码→C#2.0泛型→C#3.0LINQ→C#4.0动态语言→C#4.5异步编程
所谓的异步编程是利用CPU空闲时间和多核的特性,它所返回的Task或Task是对await的一个承诺,当任务执行完毕后返回一个结果给接收者。这里看到这个可能各位不太明白,不要紧,下面会有讲解。
二、使用说明
- 方法签名包含一个 Async 或 async 修饰符。
- 按照约定,异步方法的名称以“Async”后缀结尾。
- 返回类型为下列类型之一:
- 如果你的方法有操作数为 TResult 类型的返回语句,则为 Task。
- 如果你的方法没有返回语句或具有没有操作数的返回语句,则为 Task。
Sub in Visual Basic) if you’re writing an async event handler.”>如果你编写的是异步事件处理程序,则为 Void(Visual Basic 中为 Sub)。
有关详细信息,请参见本主题后面的“返回类型和参数”。
方法通常包含至少一个 await 表达式,该表达式标记一个点,在该点上,直到等待的异步操作完成方法才能继续。 同时,将方法挂起,并且控件返回到方法的调用方。(这里所谓的挂起就是上文所提到的承诺,异步方法承诺会给调用方一个结果)
三、示例
实践才是检验真知的最佳途径。
using System; using System.Diagnostics; using System.Net.Http; using System.Threading.Tasks; namespace 异步递归 { class Program { static void Main(string[] args) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); ConsoleAsync1(); stopwatch.Stop(); Console.WriteLine("同步方法用时:" + stopwatch.ElapsedMilliseconds); stopwatch.Reset(); stopwatch.Start(); ConsoleAsync(); stopwatch.Stop(); Console.WriteLine("异步方法用时:"+ stopwatch.ElapsedMilliseconds); Console.Read(); } private static async void ConsoleAsync() { Console.WriteLine("异步方法开始"); Console.WriteLine()); Console.WriteLine("异步方法结束"); } private static async Taskint> SumAsync(int part) { ) >= ) { ; } HttpClient client = new HttpClient(); Taskstring> getStringTask = client.GetStringAsync("http://msdn.microsoft.com"); Console.WriteLine(DateTime.Now.Millisecond + " 异步 " + (await getStringTask).Length); return await SumAsync(part); } private static void ConsoleAsync1() { Console.WriteLine("同步方法开始"); Console.WriteLine()); Console.WriteLine("同步方法结束"); } private static int SumAsync1(int part) { ) >= ) { ; } HttpClient client = new HttpClient(); Taskstring> getStringTask = client.GetStringAsync("http://msdn.microsoft.com"); Console.WriteLine(DateTime.Now.Millisecond + " 同步 " + getStringTask.Result.Length); return SumAsync1(part); } } }
1、这个例子中有两种实现方式:(1)利用异步编程的方式实现(2)利用普通同步方式实现
2、同时这个例子中实现了递归,这个可以不用考虑,博主只是想验证一下在异步的情况下,递归是否有效而已,实验结果为有效。
3、这段代码中的GetStringAsync()方法是获取远程界面内容用的,主要目的是延长响应时间。
程序结果如下:
结果说明:
1、同步方法按规矩进行,有条不紊。
2、异步方法直接执行完毕,用时7毫秒。执行过程异步于主线程。
四、尾语
微软的官方文档很值得学习,大家感兴趣的可以看看去。这里引一个流程原理图,所对应的示例到文档中去看,链接上方已给。
.NET4.5新特性之异步编程(Async和Await)的使用的更多相关文章
- .NET4.5 异步编程 async和await
msdn介绍:https://msdn.microsoft.com/zh-cn/library/hh191443.aspx 其实很简单,标记了async的方法为异步方法,从方法的左大括号开始同步执行, ...
- C#异步编程(async and await)及异步方法同步调用
1.什么是异步? 异步操作通常用于执行完成时间可能较长的任务,如打开大文件.连接远程计算机或查询数据库=异步操作在主应用程序线程以外的线程中执行.应用程序调用方法异步执行某个操作时,应用程序可在异步方 ...
- C#中的异步编程Async 和 Await
谈到C#中的异步编程,离不开Async和Await关键字 谈到异步编程,首先我们就要明白到底什么是异步编程. 平时我们的编程一般都是同步编程,所谓同步编程的意思,和我们平时说的同时做几件事情完全不同. ...
- 彻底搞懂C#异步编程 async和await的原理
1.前提 熟练掌握Task并行编程. 2.用Task并行解释async和await异步 因为控制台有多线程操作的优化,因此这里选择winform来做示例. 测试代码如下所示: 有三个textbox,一 ...
- 异步编程- async和await
使用目的 避免阻塞主线程 提高程序响应能力 C#中使用 C# 中的 Async 和 Await 关键字是异步编程的核心. 疑惑 The async and await keywords don't c ...
- .net异步编程async和await的讨论收获
微软官方描述: C# 5 引入了一种简便方法,即异步编程.此方法利用了 .NET Framework 4.5 及更高版本..NET Core 和 Windows 运行时中的异步支持. 编译器可执行开发 ...
- C#异步编程----async和await组合的写法
微软示例: private async void StartButton_Click(object sender, RoutedEventArgs e) { // ExampleMethodAsync ...
- .net 异步编程async & await关键字的思考
C# 5.0引入了两个关键字 async和await,这两个关键字在很大程度上帮助我们简化了异步编程的实现代码,而且TPL中的task与async和await有很大的关系 思考了一下异步编程中的asy ...
- 温故知新,CSharp遇见异步编程(Async/Await),聊聊异步编程最佳做法
什么是异步编程(Async/Await) Async/Await本质上是通过编译器实现的语法糖,它让我们能够轻松的写出简洁.易懂.易维护的异步代码. Async/Await是C# 5引入的关键字,用以 ...
随机推荐
- .net 分布式架构之业务消息队列
开源QQ群: .net 开源基础服务 238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BusinessMQ ## 业务消息队列 ##业务消 ...
- C#中如何在Excel工作表创建混合型图表
在进行图表分析的时候,我们可能需要在一张图表呈现两个或多个样式的图表,以便更加清晰.直观地查看不同的数据大小和变化趋势.在这篇文章中,我将分享C#中如何在一张图表中创建不同的图表类型,其中包括如何在同 ...
- J a v a 的“多重继承”
接口只是比抽象类“更纯”的一种形式.它的用途并不止那些.由于接口根本没有具体的实施细节——也就是说,没有与存储空间与“接口”关联在一起——所以没有任何办法可以防止多个接口合并到一起.这一点是至关重要的 ...
- Tomcat启动报错org.springframework.web.context.ContextLoaderListener类配置错误——SHH框架
SHH框架工程,Tomcat启动报错org.springframework.web.context.ContextLoaderListener类配置错误 1.查看配置文件web.xml中是否配置.or ...
- PAT甲级 1001. A+B Format (20)
题目原文: Calculate a + b and output the sum in standard format -- that is, the digits must be separated ...
- Java中,异常的处理及抛出
首先我们需要知道什么是异常? 常通常指,你的代码可能在编译时没有错误,可是运行时会出现异常.比如常见的空指针异常.也可能是程序可能出现无法预料的异常,比如你要从一个文件读信息,可这个文件不存在,程序无 ...
- css3制作旋转动画
现在的css3真是强大,之前很多动画都是用jq来实现,但是css3制作的动画要比jq实现起来简单很多,今天呢,我自己也写了一个css旋转动画和大家分享.效果如下面的图片 思路:1.制作之前呢,我们先来 ...
- H3 BPM:为石化企业提供一个不一样的全停大修平台
H3 BPM大型炼化企业装置全停检修管理平台(简称"全停大修")结合国际化的流程管理理念.成熟的系统技术架构.优秀的行业解决方案,为石油化工行业全停大修提供了卓越的信息化管理方案, ...
- Linux实战教学笔记05:远程SSH连接服务与基本排错(新手扫盲篇)
第五节 远程SSH连接服务与基本排错 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 远程连接LInux系统管理 1.1 为什么要远程连接Linux系统 在实际的工作场景中,虚拟机界面或物理 ...
- 项目自动化建构工具gradle 入门1——输出helloWorld
先来一个简单的例子,4个步骤: 1.进入D:\work\gradle\java 目录 ,您电脑没这目录? 那辛苦自己一级一级建立起来吧 新建文件build.gradle,文件内容是: apply p ...