说说C#的async和await 解决卡顿问题 转
2016-12-30 22:47
573 查看
C# 5.0中引入了async 和 await。这两个关键字可以让你更方便的写出异步代码。
看个例子:
可以看到,async和await关键字只是把上面的代码变得更简单易懂而已。
上面在MyClass的构造函数里调用了async关键字标记的异步方法DisplayValue(),DisplayValue()方法里执行了一个await关键字标记的异步任务GetValueAsync(),这个异步任务必须是以Task或者Task<TResult>作为返回值的,而我们也看到,异步任务执行完成时实际返回的类型是void或者TResult,DisplayValue()方法里await GetValueAsync()之后的所有代码都会在异步任务完成时才会执行。
DisplayValue()方法实际执行的代码如下:
程序的输出如下:
MyClass() End.
Value is : 2.47032822920623E-322
使用很简单,将方法名作为参数传进去就行了,最常用的是把很耗时的序列化函数传进去,以免阻塞UI进程,造成卡顿现象,影响用户体验。
看个例子:
可以看到,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); }); }
程序的输出如下:
MyClass() End.
Value is : 2.47032822920623E-322
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#~异步编程再续~await与async引起的w3wp.exe崩溃-问题友好的解决
- JavaScript ES7 中使用 async/await 解决回调函数嵌套问题
- [转]说说C#的async和await
- 说说C#的async和await
- 利用async和await异步操作解决node.js里面fs模块异步读写,同步结果的问题
- 第二十三节: EF性能篇(三)之基于开源组件 Z.EntityFrameWork.Plus.EF6解决EF性能问题 第四节:一些指令总结 定时调度系列之Quartz.Net详解 第十七节:易混淆的概念(静态和非静态、拆箱和装箱) 那些年我们一起追逐的多线程(Thread、ThreadPool、委托异步调用、Task/TaskFactory、Parallerl、async和await)
- 说说C#的async和await
- ES7 中使用 async/await 解决回调函数嵌套问题
- ReactNative踩坑日志——使用async/await语法解决网络请求的异步导致的指令执行顺序错乱问题
- 解决nodejs不支持async和await关键字的问题
- 说说C#的async和await(转)
- 说说C#的async和await(转)
- 解决js异步问题的方法--async和await(ES7)
- 请教 C# 异步 async await 问题
- 说说C#的async和await
- 说说C#的async和await
- 解决nodejs不支持async和await关键字的问题
- 说说C#的async和await的具体用法
- 说说C#的async和await
- Visual Basic .NET 和 Visual C# .NET 程序员需要解决的安全问题(二)