国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

說說C#的async和await的具體用法

2020-01-24 00:28:43
字體:
來源:轉載
供稿:網友

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進程,造成卡頓現象,影響用戶體驗。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 九寨沟县| 阿城市| 五大连池市| 贡嘎县| 淅川县| 文成县| 峨山| 石河子市| 沁阳市| 沂水县| 寿阳县| 威宁| 白河县| 新河县| 金川县| 罗山县| 滦平县| 柘城县| 河源市| 乌兰县| 洮南市| 休宁县| 三门峡市| 晋城| 集贤县| 砀山县| 深水埗区| 宁波市| 右玉县| 东兰县| 新乡市| 林口县| 柳林县| 新平| 望奎县| 富阳市| 方正县| 延边| 定日县| 弋阳县| 铁岭市|