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

public class MyClass
{public MyClass(){DisplayValue(); //这里不会阻塞System.Diagnostics.Debug.WriteLine("MyClass() End.");}public Task<double> GetValueAsync(double num1, double num2){return Task.Run(() =>{for (int i = 0; i < 1000000; i++){num1 = num1 / num2;}return num1;});}public async void DisplayValue(){double result = await GetValueAsync(1234.5, 1.01);//此处会开新线程处理GetValueAsync任务,然后方法马上返回//这之后的所有代码都会被封装成委托,在GetValueAsync任务完成时调用System.Diagnostics.Debug.WriteLine("Value is : " + result);}
}

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

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

public void DisplayValue()
{System.Runtime.CompilerServices.TaskAwaiter<double> awaiter = GetValueAsync(1234.5, 1.01).GetAwaiter();awaiter.OnCompleted(() =>{double result = awaiter.GetResult();System.Diagnostics.Debug.WriteLine("Value is : " + result);});
} 

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

程序的输出如下:

MyClass() End.

Value is : 2.47032822920623E-322

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

    public static class TaskAsyncHelper{/// <summary>/// 将一个方法function异步运行,在执行完毕时执行回调callback/// </summary>/// <param name="function">异步方法,该方法没有参数,返回类型必须是void</param>/// <param name="callback">异步方法执行完毕时执行的回调方法,该方法没有参数,返回类型必须是void</param>public static async void RunAsync(Action function, Action callback){Func<System.Threading.Tasks.Task> taskFunc = () =>{return System.Threading.Tasks.Task.Run(() =>{function();});};await taskFunc();if (callback != null)callback();}/// <summary>/// 将一个方法function异步运行,在执行完毕时执行回调callback/// </summary>/// <typeparam name="TResult">异步方法的返回类型</typeparam>/// <param name="function">异步方法,该方法没有参数,返回类型必须是TResult</param>/// <param name="callback">异步方法执行完毕时执行的回调方法,该方法参数为TResult,返回类型必须是void</param>public static async void RunAsync<TResult>(Func<TResult> function, Action<TResult> callback){Func<System.Threading.Tasks.Task<TResult>> taskFunc = ()=>{return System.Threading.Tasks.Task.Run(()=>{return function();});};TResult rlt = await taskFunc();if(callback != null)callback(rlt);}}

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

转载于:https://www.cnblogs.com/xiashenbin/p/4354570.html

语法糖----C#的async和await相关推荐

  1. python async await报错_Python 3.7.7 发布 支持async并await现在为保留关键字

    Python 3.7.7 发布了,这是一个 bug 修复版本.2020 年中之前将持续更新 3.7 系列的 bug 修复版本,并直到 2023 年中之前持续提供安全修复版本. 目前 3.8 已经是最新 ...

  2. async/await原来这就是语法糖

    带大家基本了解了Promise内部的实现原理,而提到Promise,就不得不提一个东西,那就是async/await,async/await是一个很重要的语法糖,他的作用是用同步方式,执行异步操作.那 ...

  3. Async/Await语法糖

    Async/Await语法糖 语言层面的异步编程标准 有了 Generator 之后 js 中的异步编程基本上就已经与同步代码有类似的体验了,但是使用 Generator 这种方案我们还需要去手动编辑 ...

  4. 小哥哥小姐姐,来尝尝 Async 函数这块语法糖

    编者注:众所周知,JS 最大的特性就是异步,异步提高了性能但是却给我们编写带来了一定困难,造就了令人发指的回调地狱.为了解决这个问题,一个又一个的解决方案被提出来.今天我们请来了 <JavaSc ...

  5. 细谈回调地狱终极解决方案及ES7新语法async和await

    1.回调地狱的一般解决方案 正常情况下,我们都知道用promise去解决回调地狱.通过其调用then 和catch方法来实现回调函数多层嵌套问题.但是,我们可以实际来仔细看看用promise解决回调地 ...

  6. JavaScript 异步编程--Generator函数、async、await

    JavaScript 异步编程–Generator函数 Generator(生成器)是ES6标准引入的新的数据类型,其最大的特点就是可以交出函数的执行的控制权,即:通过yield关键字标明需要暂停的语 ...

  7. asp.net html5 异步,asp.net core 系列 5 项目实战之:NetCore 的 async 和 await(参考自:Microsoft教程)...

    十年河东,十年河西,莫欺少年穷 学无止境,精益求精 1.简介 从 VS 2012 开始,新引入了一个简化的方法,称为异步编程.我们在 >= .NETFRM 4.5 中和 Windows 运行时中 ...

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

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

  9. 面试官问 async、await 函数原理是在问什么?

    大家好,我是若川.这是 源码共读活动<1个月,200+人,一起读了4周源码> 第四期,纪年小姐姐的第四次投稿.纪年小姐姐通过本次学习提早接触到generator,协程概念,了解了async ...

最新文章

  1. 第十六届全国大学生智能车竞赛全部比赛胜利结束了
  2. Mysql双向同步复制
  3. 企业如何确保精益生产管理真正落地?
  4. l麒麟安装oracle,中标麒麟5.8x64下64bitOracle11gR2安装配置手册.docx
  5. pip和conda批量导出、安装第三方依赖库(requirements.txt)
  6. Android Studio OkHttp的使用
  7. git比较当前工作区和之前提交的内容差异
  8. python导入同一文件夹下的类_Python模块导入机制与规范
  9. path、classpath理解
  10. python登录跳转_Python模拟登录和登录跳转的参考示例
  11. angular cannot get /
  12. 12.2.PHP7.1 狐教程-偶遇 -【PHP 入口】
  13. c语言else语句,C# if…else 语句 | 菜鸟教程
  14. 精通JavaScript系列目录
  15. 图神经网络——node2vec
  16. 【CC3200AI 实验教程11】疯壳·AI语音人脸识别(会议记录仪/人脸打卡机)-AI语音系统架构
  17. 管理软件开发的最高境界,那就是“无代码开发”
  18. 10以太坊Token详解
  19. 三小时学会css(菜鸟教程精华版)【中】
  20. 幻方加密代码——自动生成幻方密钥方法,罗伯法单偶数阶的解法代码基于python

热门文章

  1. 迁移Exchange Server 2003
  2. python读取json文件多个json数据_Python 加载包含多个JSON对象的JSON文件
  3. python(命令行提示符的实现、四位数能组成多少个互不相同重复三位数的实现)
  4. java读取文件指定位置_java从文件指定位置开始读取文件流
  5. SAP License:别在走SAP学习的误区
  6. 赛锐信息:SAP安全漏洞审计及工具介绍
  7. 【学习总结】数学-基本计数方法
  8. springmvc 静态资源 配置
  9. bzoj20892090: [Poi2010]Monotonicity
  10. 函数:使用数组名作为函数参数进行操作