C# 5.0中引入了async 和 await
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进程,造成卡顿现象,影响用户体验。
C# 5.0中引入了async 和 await的更多相关文章
- C# 9.0中引入的新特性init和record的使用思考
写在前面 .NET 5.0已经发布,C# 9.0也为我们带来了许多新特性,其中最让我印象深刻的就是init和record type,很多文章已经把这两个新特性讨论的差不多了,本文不再详细讨论,而是通过 ...
- Vue3.0中引入地图(谷歌+高德+腾讯+百度)
1 概述 项目需求需要引入地图,对于目前最新的Vue3.0,无论是百度/高德/腾讯地图目前还没有适配,只有Vue 2.x版本的: 目前只有谷歌地图的Vue3.0适配: 但是没有适配并不代表不能使用,本 ...
- vue2.0中引入UEditor的一些坑。。。。
开发后台系统的时候,富文本编辑器肯定是必不可少的,然后呢~在天朝当然要属百度编辑器(UEditor)最成熟了,功能全面,文档齐全(相对),ui优美(...,对于程序员来说)等等许多方面(MMP,还不是 ...
- 如何在 vue 2.0+ 中引入全局的stylus文件,且能正常
由于stylus在引用时,不能像一般的css文件直接在main.js中引用,就算引用了也会只能使用转换后的css,不能使用里面的函数,方法等,原因可能是:在这里引入会被直接编译成css,不能在别的模板 ...
- C# 5.0新推出的async和await
class Program { static void Main(string[] args) { Test t = new Test(); } } public class Test { publi ...
- vue中异步函数async和await的用法
整理的不错,收藏一下 http://blog.sina.com.cn/s/blog_13d06fc1f0102wzfr.html
- C# async and await
C# 5.0中引入了async 和 await.这两个关键字可以让你更方便的写出异步代码. 看个例子: public class MyClass { public MyClass() { Displa ...
- 说说C#的async和await 解决卡顿问题 转
C# 5.0中引入了async 和 await.这两个关键字可以让你更方便的写出异步代码. 看个例子: 可以看到,async和await关键字只是把上面的代码变得更简单易懂而已. public cla ...
- 说说C#的async和await(转)
一个简单的例子: public class MyClass { public MyClass() { DisplayValue(); //这里不会阻塞 System.Diagnostics.Debug ...
随机推荐
- Git HEAD 意思详解 和版本回退
首先,Git必须知道当前版本是哪个版本,在git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版 ...
- 快播CEO王欣:流量跌到零也要转型
曾因免费与快捷而独霸视频播放器行业的快播科技,或许将迎来壮士断腕的艰难时刻. 4月16日晚,快播于新浪微博上先后发布<公告>和<致快播用户书:我们涅槃在即>,表示快播将启动商业 ...
- UIViewController之间的相互跳转
一.最普通的视图控制器UIViewContoller 一个普通的视图控制器一般只有模态跳转的功能(ipad我不了解除外,这里只说iPhone),这个方法是所有视图控制器对象都可以用的,而实现这种功能, ...
- nginx+uwsgi+django部署流程
当我们在用django开发的web项目时,开发测试过程中用到的是django自带的测试服务器,由于其安全及稳定等性能方面的局限性,django官方并不建议将测试服务器用在实际生产. nginx+uws ...
- Web Components 是什么
/********************************************************************************* * Web Components ...
- adb安装启动Touch校正软件
/********************************************************************************* * adb安装启动Touch校正软 ...
- OpenCV-bwLabel-实现图像连通组件标记与分析
OpenCV实现图像连通组件标记与分析- matlab bwLabel; code: #include <opencv2/opencv.hpp> #include <iostream ...
- Mongodb $setOnInsert操作符 和upsert:true
upsert:true:如果要更新的文档不存在的话会插入一条新的记录 $setOnInsert操作符会将指定的值赋值给指定的字段,如果要更新的文档存在那么$setOnInsert操作符不做任何处理: ...
- SQL SERVER 2008R2 执行大脚本文件时,管理工具提示“内存不足”的解决方法
项目需求:当我把服务器上的数据库导出为SQL脚本时,在本地新建数据库,再导入执行SQL文件时报错,因为SQL文件过大,导致出现如下报错 如下图所示: ========================= ...
- test20181017 B君的第一题
题意 分析 考场做法 对p的幂打表发现,我们一定可以把x和y的二进制位从低到高依次调整成0. 具体而言,从0次幂开始每两个分为一组a,b,那么0,a,b,a+b组合中的一种可以将x,y的对应二进制位都 ...