.Net 4.5 异步编程初试(async和await)
.Net 4.5 异步编程初试(async和await)
前言
最近自己在研究Asp.Net Web API。在看到通过客户端来调用Web API的时候,看到了其中的异步编程,由于自己之前没有接触过,所以就稍微的学习了解一下。这两篇文章是:
Calling a Web API From a .NET Client (C#) http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client
Calling a Web API From a WPF Application(C#) http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-wpf-application
关于异步编程的简单理解:
在.NET4.5中新增了异步编程的新特性async和await,使得异步编程更为简单。通过特性可以将这项复杂的工作交给编译器来完成了。之前传统的方式来实现异步编程较为复杂,这样对于程序猿来说处理起来比较困难,调试也没那么方便,后续的维护工作也比较痛苦。
Async和Await关键字是C#异步编程的核心。通过使用这两个关键字,你可以使用.NET Framework 或 Windows Runtime的资源创建一个异步方法如同创建一个同步方法一样容易。
这里还有两篇是我之前对多线程简单学习的入门
http://www.cnblogs.com/aehyok/archive/2013/05/02/3054615.html
http://www.cnblogs.com/aehyok/archive/2013/05/02/3055524.html
接下来通过VS2013 创建一个基于.NET4.5的控制台应用程序进行尝试。
简单示例
先直接把简单的代码贴出来,如下所示

/// <summary>
/// 同步方法打印Hello World
/// </summary>
public static void PrintHelloWorld()
{
Console.WriteLine("同步方法调用开始");
Console.WriteLine("同步方法:Hello World");
Thread.Sleep(1000);
Console.WriteLine("退出同步方法");
} /// <summary>
/// 异步方法打印Hello World
/// </summary>
public async static void AsyncPrintHelloWorld()
{
Console.WriteLine("异步方法调用开始");
Console.WriteLine("异步方法:Hello World");
await Task.Delay(1000);
Console.WriteLine("退出异步方法");
}

上面注释中也有进行说明,第一个是同步方法,第二个是异步方法。同步方法可以通过Thread.Sleep(1000);暂停方法执行1000ms,同样的异步方法可以通过await Task.Delay(1000)来处理,而且在异步方法的声明中要加入async的关键字。
接下来是简单的调用

static void Main(string[] args)
{
Console.WriteLine("======同步方法调用=====");
PrintHelloWorld();
Console.WriteLine("同步方法调用结束"); Console.WriteLine("======异步方法调用=====");
AsyncPrintHelloWorld();
Console.WriteLine("异步方法调用结束");
Console.ReadLine();
}

F5执行后结果如下

通过执行结果可以很明显的看出,调用的同步方法里面是顺序执行的,而在异步方法中不一样,当通过Task.Delay(1000)暂停当前方法的时候,其方法外面的下面的方法会继续执行,也就是打印“异步方法调用结束”的语句。
可以发现使用了关键字之后,同步与异步的语法差别很小。随着.NET4.5的推出,许多类库和已有类库都将支持这种新型的异步语法,比如我正在学习的HTTPClient等等。
进一步说明
上面的演示只是通过简单的void的方法进行演示的,当然肯定可以带上返回值的额。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace Async
{
class Program
{
static void Main(string[] args)
{
var ret = AsyncAdd("累死了,真想不出啥好的例子来调用");
Console.WriteLine(ret.Result);
Console.ReadLine();
} ///异步打印传入的字符串
public async static Task<string> AsyncAdd(string str)
{
string result = await PringString(str);
return result; } public async static Task<string> PringString(string str)
{
return "Hello World" + str;
}
}
}

通过运行其实和同步的是一样的,只不过看看如何来定义异步方法的返回值,根据Task<T>来进行定义。
如果指定Task<TResult>为返回结果,那么这个方法必须包含return指定的TResult结果的语句。
一个async方法里通常包含一个或多个的对应的await操作符,但如果没有await表达式也不会导致编译错误。但如果调用一个async方 法,却不使用await关键字来标记一个挂起点的话,程序将会忽略async关键字并以同步的方式执行
总结
1.一个异步方法的声明中必然包含一个async的修饰符。
2.异步方法的方法名可以以“Async”结尾。
3.Task<TResult> 当你的方法有返回值时,那么TResult即返回值的类型
4.方法通常至少包含一个await表达式。
关于async和await的学习暂时就这么多,皮毛的皮毛,不过暂时已经足够了,等有时间了可以再深入的进行研究。
.Net 4.5 异步编程初试(async和await)的更多相关文章
- 异步编程(Async和Await)的使用
.net4.5新特性之异步编程(Async和Await)的使用 一.简介 首先来看看.net的发展中的各个阶段的特性:NET 与C# 的每个版本发布都是有一个“主题”.即:C#1.0托管代码→C#2. ...
- C# 异步编程,async与await的简单学习
前提声明:C# 5.0 .NET Framework 4.5 2012-08-15 异步和等待(async和await).调用方信息(Caller Information) (C#版本与.NET版本 ...
- .NET4.5新特性之异步编程(Async和Await)的使用
一.简介 首先来看看.net的发展中的各个阶段的特性:NET 与C# 的每个版本发布都是有一个"主题".即:C#1.0托管代码→C#2.0泛型→C#3.0LINQ→C#4.0动态语 ...
- 多线程之异步编程: 经典和最新的异步编程模型,async与await
经典的异步编程模型(IAsyncResult) 最新的异步编程模型(async 和 await) 将 IAsyncInfo 转换成 Task 将 Task 转换成 IAsyncInfo 示例1.使用经 ...
- .NET异步编程初识async与await
这是两个关键字,用于异步编程.我们传统的异步编程方式一般是Thread.ThreadPool.BeginXXX.EndXXX等等.把调用.回调分开来,代码的逻辑是有跳跃的,于是会导致思路不是很清晰的问 ...
- 《C#并发编程经典实例》学习笔记—异步编程关键字 Async和Await
C# 5.0 推出async和await,最早是.NET Framework 4.5引入,可以在Visual Studio 2012使用.在此之前的异步编程实现难度较高,async使异步编程的实现变得 ...
- C# 异步编程4 async与await 异步程序开发
随着C#异步程序开发系列的深入,你会发现编写异步程序越发简单.事物的发展就是这样的规律,从简单到复杂再到简单. 在C# 5.0中我们可以通过async与await关键字实现快捷的异步程序开发,如下: ...
- C# 异步编程(async&await)
同步:同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去 异步:异步是指进程不需要一直等下去,而是继续执行下面的操作 ...
- ES7中前端异步特性:async、await。
在最新的ES7(ES2017)中提出的前端异步特性:async.await. 什么是async.await? async顾名思义是"异步"的意思,async用于声明一个函数是异步的 ...
随机推荐
- Git 基本原理与经常使用命令
平时使用过两种版本号控制软件 SVN 和 Git,平心而论,假设纯粹自己使用,那么绝对 Git 更加适合,本地库.远程库.离线工作.强大而灵活的分支.大名鼎鼎的Github, 这些都是选择 Git 的 ...
- 微信公众号PHP简单开发流程
原文:微信公众号PHP简单开发流程 微信公众号开发分傻瓜模式和开发者模式两种,前者不要考虑调用某些接口,只要根据后台提示傻瓜式操作即可,适用于非专业开发人员. 开发模式当然就是懂程序开发的人员使用的. ...
- bigdata_ambari修改hiveserver_metastore链接库(从0.14 升级到1.2.1 )
第一步:[db升级 ,先看第二步] cd到 hive的 metastore upgrade目录 cd /usr/hdp/2.5.0.0-1245/hive/scripts/metastore/upg ...
- vim温馨提示
(一)各种文本操作 各种跳转 h,j,k,l h左移一个字符,j下移一行,k上移一行,l右移一个字符 w.b w 下一个单词,b上一个单词 0,$ 行首,行尾 G,gg.30% 3G跳到第3行,g ...
- 2013级C++第13周(春)项目——继承的进一步话题与GUI应用开发
课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 第一部分 程序阅读:阅读以下类的定义,请说出在 ...
- 【百度地图API】建立全国银行位置查询系统(二)——怎样为地图添加控件
原文:[百度地图API]建立全国银行位置查询系统(二)--怎样为地图添加控件 <摘要>你将在第二章中学会以下知识: 使用手写代码的利器——notepad++: 如何为地图添加控件——鱼骨. ...
- [Asp.net]站点地图SiteMap
原文:[Asp.net]站点地图SiteMap 引言 在项目中发现使用站点地图的控件,之前没总结过这方面的东西,就写了一个demo测试了一下,这里记录一下,算是总结吧. Web.sitemap < ...
- SQL表连接
背景 在上次的自考科目<数据库系统原理>中.已经接触到了关于数据库表连接的一些知识,近期的学习过程中又用到了关于数据库表的连接问题,趁此再跟大家一起回想一下. 导图总结 首先用一张思维导图 ...
- 对web.config的ConnectionString加密
原文:对web.config的ConnectionString加密 本文参考了wayshan的博客,原文地址:http://www.cnblogs.com/wayshan/archive/2012/0 ...
- 一个只能用在Win下的密码验证函数(显示星号,可删除)
以前做小程序时图好玩在网上找的代码.输入的密码会以星号显示出来,并且输入错了可以删除.因为用了专有库函数,所以只能在Windows平台使用,少用为好,不过可能还有点用.嗯…就这样了 #include ...