C#中关于async与await的使用详解

互联网 17-9-9
本篇文章主要介绍了说说C#的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);     }   }

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

以下是我写的一个静态类,可以方便将一个普通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#中关于async与await的使用详解的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: async
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:C#异步之APM模式异步程序开发的示例分享

相关资讯