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 }