这是两个关键字,用于异步编程。我们传统的异步编程方式一般是Thread、ThreadPool、BeginXXX、EndXXX等等。把调用、回调分开来,代码的逻辑是有跳跃的,于是会导致思路不是很清晰的问题,在.NET 4.5中,新推出的async、await关键字,可以帮助我们像写同步方法一样去写异步方法(保证代码的整齐清晰)。

  先来看个传统同步方法例子:

 1         static void Main(string[] args)
2 {
3 // 同步方式
4 Console.WriteLine("同步方式测试开始!");
5 SyncMethod(0);
6 Console.WriteLine("同步方式结束!");
7 Console.ReadKey();
8 }
9
10 // 同步操作
11 private static void SyncMethod(int input)
12 {
13 Console.WriteLine("进入同步操作!");
14 var result = SyancWork(input);
15 Console.WriteLine("最终结果{0}", result);
16 Console.WriteLine("退出同步操作!");
17 }
18
19 // 模拟耗时操作(同步方法)
20 private static int SyancWork(int val)
21 {
22 for (int i = 0; i < 5; ++i)
23 {
24 Console.WriteLine("耗时操作{0}", i);
25 Thread.Sleep(100);
26 val++;
27 }
28 return val;
29 }

  可以从右图中看到执行结果,是非常典型的同步执行方法。

  async关键字能用在方法、lambda表达式的声明部分,用来标示此方法可能包含await关键字,只有拥有async才能在其内部使用await关键字。异步方法可以具有Task、Task<>或void的返回类型;await关键字则是用于返回值是“可等待”类型(awaitable)的方法或lambda表达式内,“awaitable”可以是任何类型(常见的有Task、Task<>),它必须公开一个GetAwaiter() 方法并且返回有效的”awaiter”。更详细的信息可以参考“关于Async与Await的FAQ”,里面介绍了这些概念与注意事项。

  当一个async方法,且内部包含await关键字,它就会在编译的时候成为一个异步方法,如果没有await关键字,则它将只会被当成一个同步方法来执行。如果对其内部实现感兴趣可以参考“异步性能:了解 Async 和 Await 的成本”一文,相信对深入了解这种机制还是有所帮助的。

  现在我们尝试使用新出的异步关键字async、await来改造成异步调用:

        static void Main(string[] args)
{
// 异步方式
Console.WriteLine("\n异步方式测试开始!");
AsyncMethod(0);
Console.WriteLine("异步方式结束!");
Console.ReadKey();
} // 异步操作
private static async void AsyncMethod(int input)
{
Console.WriteLine("进入异步操作!");
var result = await AsyncWork(input);
Console.WriteLine("最终结果{0}", result);
Console.WriteLine("退出异步操作!");
} // 模拟耗时操作(异步方法)
private static async Task<int> AsyncWork(int val)
{
for (int i = 0; i < 5; ++i)
{
Console.WriteLine("耗时操作{0}", i);
await Task.Delay(100);
val++;
}
return val;
}

  先来看结果吧,我们发现耗时操作已经是异步进行了。整体流程大概是先由Main函数异步调用AsyncMethod,并不等待AsyncMethod完成,继续往下执行。而AsyncMethod方式在被调用后,在分配到时间片时开始启动,执行函数体内容,并由于await AsyncWork语句而继续异步调用AsyncWork,但由于await关键字,将在此等待AsyncWork完成后,再继续往下执行。那么,AyncWork也一样的,被调用后,在分配到时间片时开始启动,执行耗时操作。

  可以看到,使用了新的关键字后,同步与异步编程的语法差别进一步减少。随着.NET 4.5的推出,许多新类库和既有类库都支持这种新型的异步语法(比如HttpClient、HttpServer、MemoryStream...),它们以类似ReadAsync、WriteAsync、SendAsync等分开方法来提供具有async声明,且返回类型为Task、Task<>的异步工作方式。

  补充:

  刚才有朋友提到await Task.Delay(100)这条语句,这是为了让AsyncWork成为异步方法才加的,如果你要进行的操作不支持await修饰怎么办,其实很简单,使用Task.Factory.StartNew()就行了,举例:

 1         // 异步操作
2 private static async void AsyncMethod(int input)
3 {
4 Console.WriteLine("进入异步操作!");
5 var result = await Task.Factory.StartNew((Func<object, int>)SyncWork2, input);
6 Console.WriteLine("最终结果{0}", result);
7 Console.WriteLine("退出异步操作!");
8 }
9
10 // 模拟耗时操作(同步方法)
11 private static int SyncWork2(object input)
12 {
13 int val = (int)input;
14 for (int i = 0; i < 5; ++i)
15 {
16 Console.WriteLine("耗时操作{0}", i);
17 Thread.Sleep(100);
18 val++;
19 }
20 return val;
21 }

  这样,我们的SyncWork2实际上却是异步执行的,所得结果与前面的异步方法一致,只是这样一来输入参数只能是object类型,需要进行类型转化。另外,除了StartNew,我们还可以新建一个Task,然后调用Run,以完成同样效果。

  目前来说,这种异步工作还是会造成本人使用上的不适,不过如果在将来的版本中,继续推广使用,相信不久便能熟练,且加快写代码的速度,编写出逻辑清晰的代码。

转载请注明原址:http://www.cnblogs.com/lekko/archive/2013/03/05/2944282.html

NET4.5之初识async与await的更多相关文章

  1. 转 .NET4.5之初识async与await

    来自:http://www.cnblogs.com/lekko/archive/2013/03/05/2944282.html 本人是从.NET4.0刚出的时候接触的.NET环境,所以学的东西就是4. ...

  2. .NET4.5新特性async和await修饰符实现异步编程

    开篇 每一个版本的.net都会引入一些新的特性,这些特性方便开发人员能够快速实现一些功能.虽然.net版本一直在更新,但是新版本对旧版本的程序都是兼容的,在这一点上微软做的还是非常好的.每次学一个新内 ...

  3. .NET4.5 异步编程 async和await

    msdn介绍:https://msdn.microsoft.com/zh-cn/library/hh191443.aspx 其实很简单,标记了async的方法为异步方法,从方法的左大括号开始同步执行, ...

  4. .NET异步编程初识async与await

    这是两个关键字,用于异步编程.我们传统的异步编程方式一般是Thread.ThreadPool.BeginXXX.EndXXX等等.把调用.回调分开来,代码的逻辑是有跳跃的,于是会导致思路不是很清晰的问 ...

  5. .net4.5使用async和await异步编程实例

    关于异步编程的简单理解: 在.NET4.5中新增了异步编程的新特性async和await,使得异步编程更为简单.通过特性可以将这项复杂的工作交给编译器来完成了.之前传统的方式来实现异步编程较为复杂,这 ...

  6. Async 和 Await的性能(.NET4.5新异步编程模型)

    异步编程长时间以来一直都是那些技能高超.喜欢挑战自我的开发人员涉足的领域 — 这些人愿意花费时间,充满热情并拥有心理承受能力,能够在非线性的控制流程中不断地琢磨回调,之后再回调. 随着 Microso ...

  7. 小结:ES7——async和await初识

    一.async async其实是ES7才有有的关键字,async的意思是异步,顾名思义是有关异步的操作 async用于声明一个函数是异步的. 通常情况下async.await都是跟随promise一起 ...

  8. 探索c#之Async、Await剖析

    阅读目录: 基本介绍 基本原理剖析 内部实现剖析 重点注意的地方 总结 基本介绍 Async.Await是net4.x新增的异步编程方式,其目的是为了简化异步程序编写,和之前APM方式简单对比如下. ...

  9. C#基础系列——异步编程初探:async和await

    前言:前面有篇从应用层面上面介绍了下多线程的几种用法,有博友就说到了async, await等新语法.确实,没有异步的多线程是单调的.乏味的,async和await是出现在C#5.0之后,它的出现给了 ...

随机推荐

  1. 解决电脑访问Discuz!手机版(支持触屏版)

    discuz电脑访问手机版的方法现在需要来修改一下2个文件,即可用电脑浏览discuz的手机版本:找到./source/function/function_core.php 文件,查找 : funct ...

  2. 归纳整理 PHP大神的十大优良习惯

    2015年03月04日11:26 来源:程序师 作者:TECHUG 编辑:覃里 查看全文 赞(0)评论(0) 分享 标签: PHP , 编程指南 , PHP开源项目 [IT168 资讯] 1.多阅读手 ...

  3. typecho流程原理和插件机制浅析(第一弹)

    typecho流程原理和插件机制浅析(第一弹) 兜兜 393 2014年03月28日 发布 推荐 5 推荐 收藏 24 收藏,3.5k 浏览 虽然新版本0.9在多次跳票后终于发布了,在漫长的等待里始终 ...

  4. php调用empty出现错误Can't use function return value in write context

    php调用empty出现错误Can't use function return value in write context 2012-10-28 09:33:22 | 11391次阅读 | 评论:0 ...

  5. Yii2目录结构

    assets   前端资源文件夹,大致用于管理css js等前端资源文件等 commands   包含命令行命令  文件为控制器文件 config 应用程序的配置文件 controllers 控制器文 ...

  6. thinkphp 设计思想

    thinkphp 运行机制: thinkphp首先设置一些常量.然后运行Think对象(系统环境),装载think的运行环境,包括:自动加载.异常处理.功能核心等.环境准备好后,运行App对象(应用程 ...

  7. JAVA中的throws和throw的区别

    Java     一直对java中的throws和throw不太理解.最近一直在查这两个方面的资料,算是能明白一点吧.如果我下面的观点哪有不对,希望指出来,我加以改进.         throw:( ...

  8. 蓝牙BLE ATT剖析(二)-- PDU

    一.Error Handling Error Response The Error Responseis used to state that a given request cannot be pe ...

  9. 【Android测试】【第二节】ADB——无线模式

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处.      转载请注明出处:http://www.cnblogs.com/by-dream/p/4635782.html 啰嗦两句啊.本来以为adb ...

  10. angularJS平行控制器间共享数据

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...