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. SQL SERVER赋权限

    --创建登录账户 use master GO EXEC sp_addlogin 'jacky', 'pwd' --EXEC sp_droplogin 'jacky' --删除登陆账户 use Test ...

  2. iOS - OC NSEnumerator 迭代器

    前言 @interface NSEnumerator<ObjectType> : NSObject <NSFastEnumeration> Xcode 7 对系统中常用的一系列 ...

  3. JS实现复选框全选全不选以及子复选框带动全选框的选中

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. Android中xml设置Animation动画效果详解

    在 Android 中, Animation 动画效果的实现可以通过两种方式进行实现,一种是 tweened animation 渐变动画,另一种是 frame by frame animation ...

  5. 键盘控制div移动

    <!DOCTYPE html><html lang="zh-CN"><head> <meta charset="UTF-8&qu ...

  6. [css]【转载】CSS样式分离之再分离

    原文链接:http://www.zhangxinxu.com/wordpress/2010/07/css%E6%A0%B7%E5%BC%8F%E5%88%86%E7%A6%BB%E4%B9%8B%E5 ...

  7. 【服务器环境搭建-Centos】Nginx1.9.9 配置启用 --待续

    1.worker_processes worker_processes 4;## 4核,所以设置4个 worker_cpu_affinity 0001 0010 0100 1000; nginx在启动 ...

  8. IntelliJ IDEA 学习(六)内存设置

    小伙伴们经常会发现,在开发的时候,经常遇到内存被占满,导致异常卡顿,有时候提示内存溢出,这时可以通过设置xmx来改善.不过切记最好不要超过内存的1/4 打开 IDEA 安装目录,看到有一个 bin 目 ...

  9. JavaScript的事件对象_概述/this

    JavaScript 事件的一个重要方面是它们拥有一些相对一致的特点,可以给你的开发提供更多的强大功能. 最方便和强大的就是事件对象,他们可以帮你处理鼠标事件和键盘敲击方面的情况,此外还可以修改一般事 ...

  10. python操作mongodb之七时间和时区

    #时间和时区 import datetime db.test.insert_one({"datetime-datetime-utcnow":datetime.datetime.ut ...