C#的async和await

  1 例子1:
  2  
  3 public class MyClass
  4 {
  5     public MyClass()
  6     {
  7         DisplayValue(); //這裏不會阻塞
  8         System.Diagnostics.Debug.WriteLine("MyClass() End.");
  9     }
 10     public Task<double> GetValueAsync(double num1, double num2)
 11     {
 12         return Task.Run(() =>
 13         {
 14             for (int i = 0; i < 1000000; i++)
 15             {
 16                 num1 = num1 / num2;
 17             }
 18             return num1;
 19         });
 20     }
 21     public async void DisplayValue()
 22     {
 23         double result = await GetValueAsync(1234.5, 1.01);//此處會開新線程處理GetValueAsync任務,而後方法立刻返回
 24         //這以後的全部代碼都會被封裝成委託,在GetValueAsync任務完成時調用
 25         System.Diagnostics.Debug.WriteLine("Value is : " + result);
 26     }
 27 }
 28  
 29 上面在MyClass的構造函數裏調用了async關鍵字標記的異步方法DisplayValue(),DisplayValue()方法裏執行了一個await關鍵字標記的異步任務GetValueAsync(),這個異步任務必須是以Task或者Task<TResult>做爲返回值的,而咱們也看到,異步任務執行完成時實際返回的類型是void或者TResult,DisplayValue()方法裏await GetValueAsync()以後的全部代碼都會在異步任務完成時纔會執行。
 30 
 31 DisplayValue()方法實際執行的代碼以下: 
 32 
 33 public void DisplayValue()
 34 {
 35     System.Runtime.CompilerServices.TaskAwaiter<double> awaiter = GetValueAsync(1234.5, 1.01).GetAwaiter();
 36     awaiter.OnCompleted(() =>
 37         {
 38             double result = awaiter.GetResult();
 39             System.Diagnostics.Debug.WriteLine("Value is : " + result);
 40         });
 41 } 
 42  能夠看到,async和await關鍵字只是把上面的代碼變得更簡單易懂而已。
 43 程序的輸出以下:
 44 
 45 MyClass() End.
 46 
 47 Value is : 2.47032822920623E-322
 48 
 49 普通Function執行異步調用: 
 50 
 51     public static class TaskAsyncHelper
 52     {
 53         /// <summary>
 54         /// 將一個方法function異步運行,在執行完畢時執行回調callback
 55         /// </summary>
 56         /// <param name="function">異步方法,該方法沒有參數,返回類型必須是void</param>
 57         /// <param name="callback">異步方法執行完畢時執行的回調方法,該方法沒有參數,返回類型必須是void</param>
 58         public static async void RunAsync(Action function, Action callback)
 59         {
 60             Func<System.Threading.Tasks.Task> taskFunc = () =>
 61             {
 62                 return System.Threading.Tasks.Task.Run(() =>
 63                 {
 64                     function();
 65                 });
 66             };
 67             await taskFunc();
 68             if (callback != null)
 69                 callback();
 70         }
 71         /// <summary>
 72         /// 將一個方法function異步運行,在執行完畢時執行回調callback
 73         /// </summary>
 74         /// <typeparam name="TResult">異步方法的返回類型</typeparam>
 75         /// <param name="function">異步方法,該方法沒有參數,返回類型必須是TResult</param>
 76         /// <param name="callback">異步方法執行完畢時執行的回調方法,該方法參數爲TResult,返回類型必須是void</param>
 77         public static async void RunAsync<TResult>(Func<TResult> function, Action<TResult> callback)
 78         {
 79             Func<System.Threading.Tasks.Task<TResult>> taskFunc = ()=>
 80                 {
 81                     return System.Threading.Tasks.Task.Run(()=>
 82                         {
 83                             return function();
 84                         });
 85                 };
 86             TResult rlt = await taskFunc();
 87             if(callback != null)
 88                 callback(rlt);
 89         }
 90     }
 91  使用很簡單,將方法名做爲參數傳進去就好了.
 92 
 93 例子2: 
 94 
 95         /*
 96         public Task<int> Write(byte[] data, int len)
 97         {
 98             return Task.Run(() =>
 99             {
100                 byte[] ds = new byte[] { 0x58, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 08, 0x4c };
101                 if (HwPort.IsOpen) HwPort.Write(ds, 0, ds.Length);
102                 return len;
103             });
104         }
105         public async void WriteAsync(byte[] data = null, int len = 0)
106         {
107             int rt = await Write(data, len);
108             Console.WriteLine("async/await: " + rt);
109         }
110         */
111         public async void Write(byte[] data = null, int len = 0)
112         {
113             var rt = await Task.Run(() =>
114             {
115                 byte[] ds = new byte[] {0x58, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 08, 0x4c};
116                 if (HwPort.IsOpen) HwPort.Write(ds, 0, ds.Length);
117                 return len;
118             });
119             Console.WriteLine("async/await completed.[" + rt + "]");
120         }
相關文章
相關標籤/搜索