這是上篇《開始接觸 async/await 異步編程》(入門)的第二章內容,主要是深入了解異步方法,建議大家先看入門篇,很短。
本文要求了解委托的使用。
①在返回類型之前包含 async 關鍵字
②它只是標識該方法包含一個或多個 await 表達式,即,它本身不創建異步操作。
③它是上下文關鍵字,即可作為變量名。
現在先來著重分析一下這三種返回值類型:void、Task 和 Task<T>
(1)Task<T>:調用方法要從調用中獲取一個 T 類型的值,異步方法的返回類型就必須是Task<T>。調用方法從 Task 的 Result 屬性獲取的就是 T 類型的值。
1 private static void Main(string[] args) 2 { 3 Task<int> t = Calculator.AddAsync(1, 2); 4 5 //一直在干活 6 7 Console.WriteLine($"result: {t.Result}"); 8 9 Console.Read(); 10 } Program.cs 1 internal class Calculator 2 { 3 private static int Add(int n, int m) 4 { 5 return n + m; 6 } 7 8 public static async Task<int> AddAsync(int n, int m) 9 { 10 int val = await Task.Run(() => Add(n, m)); 11 12 return val; 13 } 14 } View Code
(2)Task:調用方法不需要從異步方法中取返回值,但是希望檢查異步方法的狀態,那麼可以選擇可以返回 Task 類型的對象。不過,就算異步方法中包含 return 語句,也不會返回任何東西。
1 private static void Main(string[] args) 2 { 3 Task t = Calculator.AddAsync(1, 2); 4 5 //一直在干活 6 7 t.Wait(); 8 Console.WriteLine("AddAsync 方法執行完成"); 9 10 Console.Read(); 11 } Program.cs 1 internal class Calculator 2 { 3 private static int Add(int n, int m) 4 { 5 return n + m; 6 } 7 8 public static async Task AddAsync(int n, int m) 9 { 10 int val = await Task.Run(() => Add(n, m)); 11 Console.WriteLine($"Result: {val}"); 12 } 13 } View Code圖4
圖5
(3)void:調用方法執行異步方法,但又不需要做進一步的交互。
1 private static void Main(string[] args) 2 { 3 Calculator.AddAsync(1, 2); 4 5 //一直在干活 6 7 Thread.Sleep(1000); //掛起1秒鐘 8 Console.WriteLine("AddAsync 方法執行完成"); 9 10 Console.Read(); 11 } Program.cs 1 internal class Calculator 2 { 3 private static int Add(int n, int m) 4 { 5 return n + m; 6 } 7 8 public static async void AddAsync(int n, int m) 9 { 10 int val = await Task.Run(() => Add(n, m)); 11 Console.WriteLine($"Result: {val}"); 12 } 13 } Calculator.cs圖6
圖7
圖2-1
圖2-2
上面 4 個 Task.Run() 都是采用了 Task Run(Func<TReturn> func) 形式。
Task.Run() 支持 4 中不同的委托類型所表示的方法:Action、Func<TResult>、Func<Task> 和 Func<Task<TResult>>
1 internal class Program 2 { 3 private static void Main(string[] args) 4 { 5 var t = Do.GetGuidAsync(); 6 t.Wait(); 7 8 Console.Read(); 9 } 10 11 private class Do 12 { 13 public static async Task GetGuidAsync() 14 { 15 await Task.Run(() => { Console.WriteLine(Guid.NewGuid()); }); //Action 16 17 Console.WriteLine(await Task.Run(() => Guid.NewGuid())); //Func<TResult> 18 19 await Task.Run(() => Task.Run(() => { Console.WriteLine(Guid.NewGuid()); })); //Func<Task> 20 21 Console.WriteLine(await Task.Run(() => Task.Run(() => Guid.NewGuid()))); //Func<Task<TResult>> 22 } 23 } 24 } View Code
入門:《開始接觸 async/await 異步編程》
--這是預覽版本,最終整理完校對後將放上首頁,不便之處請諒解--