C# 5.0中引入了async 和 await。这两个关键字可以让你更方便的写出异步代码。

看个例子:

  1. public class MyClass
  2. {
  3. public MyClass()
  4. {
  5. DisplayValue(); //这里不会阻塞
  6. System.Diagnostics.Debug.WriteLine("MyClass() End.");
  7. }
  8. public Task<double> GetValueAsync(double num1, double num2)
  9. {
  10. return Task.Run(() =>
  11. {
  12. for (int i = 0; i < 1000000; i++)
  13. {
  14. num1 = num1 / num2;
  15. }
  16. return num1;
  17. });
  18. }
  19. public async void DisplayValue()
  20. {
  21. double result = await GetValueAsync(1234.5, 1.01);//此处会开新线程处理GetValueAsync任务,然后方法马上返回
  22. //这之后的所有代码都会被封装成委托,在GetValueAsync任务完成时调用
  23. System.Diagnostics.Debug.WriteLine("Value is : " + result);
  24. }
  25. }

上面在MyClass的构造函数里调用了async关键字标记的异步方法DisplayValue(),DisplayValue()方法里执行了一个await关键字标记的异步任务GetValueAsync(),这个异步任务必须是以Task或者Task<TResult>作为返回值的,而我们也看到,异步任务执行完成时实际返回的类型是void或者TResult,DisplayValue()方法里await GetValueAsync()之后的所有代码都会在异步任务完成时才会执行。

DisplayValue()方法实际执行的代码如下:

  1. public void DisplayValue()
  2. {
  3. System.Runtime.CompilerServices.TaskAwaiter<double> awaiter = GetValueAsync(1234.5, 1.01).GetAwaiter();
  4. awaiter.OnCompleted(() =>
  5. {
  6. double result = awaiter.GetResult();
  7. System.Diagnostics.Debug.WriteLine("Value is : " + result);
  8. });
  9. }

可以看到,async和await关键字只是把上面的代码变得更简单易懂而已。

程序的输出如下:

MyClass() End.

Value is : 2.47032822920623E-322

以下是我写的一个静态类,可以方便将一个普通Function执行异步调用:

  1. public static class TaskAsyncHelper
  2. {
  3. /// <summary>
  4. /// 将一个方法function异步运行,在执行完毕时执行回调callback
  5. /// </summary>
  6. /// <param name="function">异步方法,该方法没有参数,返回类型必须是void</param>
  7. /// <param name="callback">异步方法执行完毕时执行的回调方法,该方法没有参数,返回类型必须是void</param>
  8. public static async void RunAsync(Action function, Action callback)
  9. {
  10. Func<System.Threading.Tasks.Task> taskFunc = () =>
  11. {
  12. return System.Threading.Tasks.Task.Run(() =>
  13. {
  14. function();
  15. });
  16. };
  17. await taskFunc();
  18. if (callback != null)
  19. callback();
  20. }
  21. /// <summary>
  22. /// 将一个方法function异步运行,在执行完毕时执行回调callback
  23. /// </summary>
  24. /// <typeparam name="TResult">异步方法的返回类型</typeparam>
  25. /// <param name="function">异步方法,该方法没有参数,返回类型必须是TResult</param>
  26. /// <param name="callback">异步方法执行完毕时执行的回调方法,该方法参数为TResult,返回类型必须是void</param>
  27. public static async void RunAsync<TResult>(Func<TResult> function, Action<TResult> callback)
  28. {
  29. Func<System.Threading.Tasks.Task<TResult>> taskFunc = ()=>
  30. {
  31. return System.Threading.Tasks.Task.Run(()=>
  32. {
  33. return function();
  34. });
  35. };
  36. TResult rlt = await taskFunc();
  37. if(callback != null)
  38. callback(rlt);
  39. }
  40. }

使用很简单,将方法名作为参数传进去就行了,最常用的是把很耗时的序列化函数传进去,以免阻塞UI进程,造成卡顿现象,影响用户体验。

[转]说说C#的async和await的更多相关文章

  1. [译] C# 5.0 中的 Async 和 Await (整理中...)

    C# 5.0 中的 Async 和 Await [博主]反骨仔 [本文]http://www.cnblogs.com/liqingwen/p/6069062.html 伴随着 .NET 4.5 和 V ...

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

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

  3. Async和Await异步编程的原理

    1. 简介 从4.0版本开始.NET引入并行编程库,用户能够通过这个库快捷的开发并行计算和并行任务处理的程序.在4.5版本中.NET又引入了Async和Await两个新的关键字,在语言层面对并行编程给 ...

  4. 异步方法的意义何在,Async和await以及Task的爱恨情仇,还有多线程那一家子。

    前两天刚感受了下泛型接口的in和out,昨天就开始感受神奇的异步方法Async/await,当然顺路也看了眼多线程那几个.其实多线程异步相关的类单个用法和理解都不算困难,但是异步方法Async/awa ...

  5. 多线程之异步编程: 经典和最新的异步编程模型,async与await

    经典的异步编程模型(IAsyncResult) 最新的异步编程模型(async 和 await) 将 IAsyncInfo 转换成 Task 将 Task 转换成 IAsyncInfo 示例1.使用经 ...

  6. 浅谈async、await关键字 => 深谈async、await关键字

    前言 之前写过有关异步的文章,对这方面一直比较弱,感觉还是不太理解,于是会花点时间去好好学习这一块,我们由浅入深,文中若有叙述不稳妥之处,还请批评指正. 话题 (1)是不是将方法用async关键字标识 ...

  7. 使用 Async 和 Await 的异步编程(C# 和 Visual Basic)[msdn.microsoft.com]

    看到Microsoft官方一篇关于异步编程的文章,感觉挺好,不敢独享,分享给大家. 原文地址:https://msdn.microsoft.com/zh-cn/library/hh191443.asp ...

  8. 【转】【C#】C# 5.0 新特性——Async和Await使异步编程更简单

    一.引言 在之前的C#基础知识系列文章中只介绍了从C#1.0到C#4.0中主要的特性,然而.NET 4.5 的推出,对于C#又有了新特性的增加--就是C#5.0中async和await两个关键字,这两 ...

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

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

  10. C# Async与Await的使用

    这个是.NET 4.5的特性,所以要求最低.NET版本为4.5. 看很多朋友还是使用的Thread来使用异步多线程操作,基本上看不见有使用Async.Await进行异步编程的.各有所爱吧,其实都可以. ...

随机推荐

  1. vsftpd的主动模式与被动模式

    好不容易配置好了vsftpd服务,在CentOS本机测试没有问题,但是在我的Windows机器上使用FlashFXP连接的时候却出问题了: 我虽然知道FTP存在两种模式:PORT(主动)模式.PASV ...

  2. 今天开始着手原来Office系统的重构

    原来系统架构Spring+Hibernate+Struts+springsecurity 拟改成 Spring+SpringMVC+MyBatis/JDBC+Shiro 同时优化前端的CSS和JQue ...

  3. Storm启动流程简介

    storm启动流程          storm是一个流行的开源的,分布式实时处理框架,关于storm的基本介绍可以参加这篇官方文档.大致的拓扑结构如图所示:        其中Nimbus是一个后台 ...

  4. 2.5 ListView

    ListView的工作原理如下: ListView 针对每个item,要求 adapter "返回一个视图" (getView),也就是说ListView在开始绘制的时候,系统首先 ...

  5. mvc-servlet---ServletConfig与ServletContext对象详解(转载)

    ServletConfig与ServletContext对象详解 一.ServletConfig对象    在Servlet的配置文件中,可以使用一个或多个<init-param>标签为s ...

  6. 让IE支持placeholder属性~

    原文:https://www.oschina.net/code/snippet_206691_26471#44160 让支持的直接路过,不支持的,完美显示~~ /*  * jQuery placeho ...

  7. 20+ 个很有用的 jQuery 的 Google 地图插件

    转自:http://www.oschina.net/translate/20-useful-jquery-google-maps-plugins Google 地图在寻找我们想要了解的商店或者其它有趣 ...

  8. 解读SQL 内存数据库的细节

    相信大家对内存数据库的 概念并不陌生,之前园子里也有多位大牛介绍过SQL内存数据库的创建方法,我曾仔细 拜读过,有了大致了解,不过仍有很多细节不清晰,比如: (1)内存数据库是把整个数据库放到内存中的 ...

  9. [安卓] 4、CheckBox、RadioButton和Toast简单用法

      和按钮类似,这里采用cb1.setOnCheckedChangeListener(this);方法分别对3个CheckBox进行CheckChange事件绑定,然后在onCheckedChange ...

  10. C++ 用于大型程序的工具

    <C++ Primer 4th>读书笔记 相对于小的程序员团队所能开发的系统需求而言,大规模编程对程序设计语言的要求更高.大规模应用程序往往具有下列特殊要求: 1. 更严格的正常运转时间以 ...