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

看个例子:

[csharp] view plaincopy
  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()方法实际执行的代码如下:

[csharp] view plaincopy
  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执行异步调用:

[csharp] view plaincopy
  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# 5.0中引入了async 和 await相关推荐

  1. Elasticsearch 7.0中引入的新集群协调子系统如何使用?

    Elasticsearch之所以如此流行,其中一个原因是它可以从只有几个节点的小集群扩展到拥有数百个节点的大集群.它的核心是集群协调子系统.Elasticsearch 7提供了一个新的集群协调子系统, ...

  2. C# 9.0中引入的新特性init和record的使用思考

    .NET 5.0已经发布,C# 9.0也为我们带来了许多新特性,其中最让我印象深刻的就是init和record type,很多文章已经把这两个新特性讨论的差不多了,本文不再详细讨论,而是通过使用角度来 ...

  3. net应用程序中发生了未经处理的异常怎么办_介绍一些在.NET Core 3.0中引入的诊断改进工具...

    编者按:即使.NET Core3.1.5已经发布,在进行.NET Core的性能诊断时,我们有时依然不知该从何处下手,那这篇介绍.NET Core3.0中引入的诊断工具,或许能为我们提供参考. 在.N ...

  4. boost log 能不能循环覆盖_如何在 JS 循环中正确使用 async 与 await

    引言 async / await是ES7的重要特性之一,也是目前社区里公认的优秀异步解决方案.目前,async / await这个特性已经是stage 3的建议 然而,由于部分开发人员对该语法糖原理的 ...

  5. vue中异步函数async和await的用法

    先说一下async的用法,它作为一个关键字放到函数前面,用于表示函数是一个异步函数,因为async就是异步的意思, 异步函数也就意味着该函数的执行不会阻塞后面代码的执行. 写一个async 函数 as ...

  6. vue2.0中引入wangEditor2 步骤与坑

    安装:官方给出了如下安装方式 点击 https://github.com/wangfupeng1988/wangEditor/releases 下载最新版 使用git下载: git clone htt ...

  7. Vue2.0中引入element-ui

    1.在项目的Terminal中查看vue版本 vue  -V 2.安装Element-UI模块 cnpm install element-ui --save 3.在项目的src/main.js中加入如 ...

  8. 关于Vue2.0中引入jQuery

    1.npm i jquery -S 2.在vue.config.js(无该文件的在根目录创建该文件)中配置 添加configureWebpack中的内容 var webpack = require(& ...

  9. C#的async和await

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

最新文章

  1. 岚图FREE入局之战,手握哪些底牌?
  2. 向上造型和向下造型_国标舞So easy?!亲,你怕是凹错造型咯~
  3. apiCloud中的API对象
  4. Linux Shell脚本_设置最大打开文件数
  5. 国庆档43.87亿收官:《长津湖》一家独大 影视股喜忧参半
  6. Flume之Source
  7. C++输出倒三角加数字
  8. StarUML 系列,静态图与动态图,用例图,类图【ps:熟悉一下starUML】
  9. Qt_我写过的bug
  10. python读书心得体会范文_读书心得体会范文5篇
  11. 结构光三维重建(一)条纹结构光三维重建
  12. 山东理工ACM【1216】杨辉三角
  13. ERC-3525 通过倒计时 SFT 是什么?有什么用?
  14. deepinV20 显卡驱动 cuda10.2+cudnn配置
  15. 如何将3d文件在网页中显示(webGL,three.js)
  16. Java中OutOfMemoryError(内存溢出)的三种情况及解决办法
  17. 我对平均值,期望,大数定律之间的联系的理解
  18. 《Windows 8 权威指南》——2.4 Aero与Metro的触摸对比
  19. 牛客竞赛小白试炼(20201205 怕npy的牛牛)
  20. Oracle索引梳理系列(十)- 直方图使用技巧及analyze table操作对直方图统计的影响(谨慎使用)...

热门文章

  1. maven中打包项目为war包的pom.xml配置
  2. 基于OHCI的USB主机 —— OHCI(端点)
  3. Centos7下安装apache2.4 php5.6 pdo_oci oci8
  4. C# 类型实例化的语法糖--unity下诡异结果
  5. SDUT 2384 El Dorado
  6. 项目中的技巧经验汇总
  7. 使用Vue动态生成form表单的实例代码
  8. 7-Python3从入门到实战—基础之数据类型(字典-Dictionary)
  9. 《数字逻辑设计与计算机组成》一3.3 加法器
  10. CoreAnimation动画