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. }
 
 
 

其实他们两个都是委托【代理】的简写形式。

一、【action<>】指定那些只有输入参数,没有返回值的委托

Delegate的代码:

  1. public delegate void myDelegate(string str);
  2. public static void HellowChinese(string strChinese)
  3. {
  4. Console.WriteLine("Good morning," + strChinese);
  5. Console.ReadLine();
  6. }
  7. myDelegate d = new myDelegate(HellowChinese);
  8. d("Mr wang");

用了Action之后呢:

  1. public static void HellowChinese(string strChinese)
  2. {
  3. Console.WriteLine("Good morning," + strChinese);
  4. Console.ReadLine();
  5. }
  6. Action<string> action = HellowChinese;
  7. action("Spring.");

就是相当于省去了定义委托的步骤了。

二、func<> 这个和上面的那个是一样的,区别是这个有返回值!

  1. public static string HelloEnglish(string strEnglish)
  2. {
  3. return "Hello." + strEnglish;
  4. }
  5. Func<string, string> f = HelloEnglish;
  6. Console.WriteLine(f("Srping ji"));
  7. Console.ReadLine();

async 和 await 以及Action Func的更多相关文章

  1. C# Task中的Func, Action, Async与Await的使用

    在说Asnc和Await之前,先说明一下Func和Action委托, Task任务的基础的用法 1. Func Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate, ...

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

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

  3. C# async and await

    C# 5.0中引入了async 和 await.这两个关键字可以让你更方便的写出异步代码. 看个例子: public class MyClass { public MyClass() { Displa ...

  4. async和await

    总结下博客园中看到的async和await public static class TaskAsyncHelper { /// <summary> /// 将一个方法function异步运 ...

  5. (译)关于async与await的FAQ

    传送门:异步编程系列目录…… 环境:VS2012(尽管System.Threading.Tasks在.net4.0就引入,在.net4.5中为其增加了更丰富的API及性能提升,另外关键字”async” ...

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

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

  7. 说说C#的async和await 解决卡顿问题 转

    C# 5.0中引入了async 和 await.这两个关键字可以让你更方便的写出异步代码. 看个例子: 可以看到,async和await关键字只是把上面的代码变得更简单易懂而已. public cla ...

  8. 说说C#的async和await(转)

    一个简单的例子: public class MyClass { public MyClass() { DisplayValue(); //这里不会阻塞 System.Diagnostics.Debug ...

  9. [转]说说C#的async和await

    C# 5.0中引入了async 和 await.这两个关键字可以让你更方便的写出异步代码. 看个例子: public class MyClass { public MyClass() { Displa ...

随机推荐

  1. 初识Oracle

    登录时无法登陆:   无监听程序 ———>启动服务OracleXETNListener   监听程序当前无法识别连接描述中的请求服务————>重启服务       OracleServic ...

  2. Java中ArrayList相关的5道面试题

    本文参考了 <关于ArrayList的5道面试题 > 1.ArrayList的大小是如何自动增加的? 这个问题我想曾经debug过并且查看过arraylist源码的人都有印象,它的过程是: ...

  3. MySQL Server 5.7解压版缺少文件无法启动

    如题: 一般认为5.7中mysql目录下 缺少data/mysql/目录,导致无法启动: 解决方案: 重新安装5.6即可: 1.删除5.7中安装的服务: 到mysql\bin目录下运行:mysqld ...

  4. js打印出对象的方法

    var description = ""; for (var i in order) { var property = order[i]; description += i + & ...

  5. JavaSE复习_3 继承

    △先默认初始化,在显示初始化,在构造函数初始化 △继承的弊端:代码的耦合性增加了. △子类不能继承父类的构造方法. △子类会拥有父类的私有成员变量,但是必须通过get,set方法访问. △super不 ...

  6. 转:Effective c + + notes

    补充自己的. 转自:http://blog.csdn.net/ysu108/article/details/9853963#t0 Effective C++ 笔记 目录(?)[-] 第一章 从C转向C ...

  7. Hibernate中的Configuration类

    Configuration类用来管理我们的配置文件的信息的,通过它,我们可以通过创建一个configuration实例来管理相应的配置文档,但是通常我们只创建一个configuration实例. 下面 ...

  8. matlab cross 3*1 向量叉乘

    一定是1*3  或者3*1 的向量才可以叉乘 A=[1 2 3] B=[4 5 6] cross(A,B) ans=[-3 6 -3] 解决机器人微分运动量之间的等价关系

  9. Xml反序列化

    XML的反序列化可在类的属性上标记特性来隐射反序列化.例如这种形式 public class PaymentAccount { [XmlAttribute("name")] pub ...

  10. Python 练习 12

    #!/usr/bin/python # -*- coding: UTF-8 -*- year = int(raw_input('year:\n')) month = int(raw_input('mo ...