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);}}

转载于:https://www.cnblogs.com/hnsongbiao/p/5060751.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. JavaScript 异步编程--Generator函数、async、await

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

  3. C# 中的Async 和 Await 的用法详解

    众所周知C#提供Async和Await关键字来实现异步编程.在本文中,我们将共同探讨并介绍什么是Async 和 Await,以及如何在C#中使用Async 和 Await. 同样本文的内容也大多是翻译 ...

  4. node mysql await_node.js中对 mysql 进行增删改查等操作和async,await处理

    要对mysql进行操作,我们需要安装一个mysql的库. 一.安装mysql库 npm install mysql --save 二.对mysql进行简单查询操作 const mysql = requ ...

  5. C# 5.0中引入了async 和 await

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

  6. ES6中的promise、async、await用法详解

    <!DOCTYPE html> <html> <head><title>Promise.async.await</title> </h ...

  7. 多线程编程学习笔记——async和await(三)

    接上文 多线程编程学习笔记--async和await(一) 接上文 多线程编程学习笔记--async和await(二) 五.   处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...

  8. Async和Await如何简化异步编程几个实例

    引言 C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作,下面就具体看看编译器到底在背后帮我们做了哪些复杂的工作的. 同步代码存 ...

  9. node.js中对 mysql 进行增删改查等操作和async,await处理

    要对mysql进行操作,我们需要安装一个mysql的库. 一.安装mysql库 npm install mysql --save 二.对mysql进行简单查询操作 const mysql = requ ...

  10. 【转载】 C# 中的Async 和 Await 的用法详解

    众所周知C#提供Async和Await关键字来实现异步编程.在本文中,我们将共同探讨并介绍什么是Async 和 Await,以及如何在C#中使用Async 和 Await. 同样本文的内容也大多是翻译 ...

最新文章

  1. 轻松搞定Retrofit不同网络请求方式的请求参数配置,及常用注解使用
  2. Hibernate 注解映射
  3. 开源 免费 java CMS - FreeCMS1.9 移动APP管理 执行配置
  4. java生成首字母拼音简码的总结
  5. VC皮肤库SkinCrafter v3 4 0 0使用
  6. Codeforces Round #162 (Div. 2) B. Roadside Trees (Simplified Edition)
  7. SharePoint中添加或者修改Item时调用EventReceiver(Event Handler)处理额外的逻辑
  8. 微软发布ASP.NET 5路线图
  9. ASP.NET自定义控件组件开发
  10. linux拷贝不是某个后缀的文件夹,linux下怎么把一个文件复制到多个文件夹里
  11. kali wifi密码 破解
  12. 新建web项目上传SVN服务器
  13. 搭建IMXRT1020单片机开发环境(采用MCUXpressoIDE,包括安装SDK)
  14. 如何推导欧拉公式e^iθ=cosθ+i*sinθ
  15. netstat 为什么不显示进程 PID / Program Name
  16. matlab画三维图和等高线,matlab画三维等高线图
  17. 腾讯安全ApkPecker上线DEX-VMP自动化脱壳服务
  18. 【lnmp+ELK+Nginx+GeoIP】超详细新版ELK8.5.0解析收集Nginx日志并实现数据可视化与IP地址地图可视化教程-2022年11月版
  19. idea 导入项目java类图标C不见了,显示出J标识解决办法
  20. RemotelyAnywhere 远程管理软件

热门文章

  1. 第三章 数据的图形展示
  2. 特斯拉超级充电桩亮相:充电5分钟能跑百公里
  3. Best Free Network Performance Test tool – Iperf
  4. 贷款必看:如何信审电话才能提高贷款通过率?
  5. 开榨油店的失败教训_想开水果店没有经验?线下开水果店经营心得分享,或许你用得上...
  6. linux传输文件scp自动接密码,配置scp在Linux或Unix之间传输文件无需密码
  7. java break 在if 中使用_java中使用国密SM4算法详解
  8. python第五次作业——陈灵院
  9. 获取网络时间,在不同时间触发事件
  10. 版本控制--搭建 GitLab 服务器