1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading; 6 using System.Threading.Tasks; 7 8 namespace 異步 9 { 10 class AwaitAsyncShow 11 { 12 13 14 #region 沒有await前提下與普通方法無異 15 /// <summary> 16 /// 注:async與await要成對出現,不然生命async方法無效 17 /// async與await只能在方法中聲明,以下 18 /// </summary> 19 public static async void Show() //這裏有警告正常 20 { 21 Console.WriteLine("開始執行前..."); 22 Task task = Task.Run(() => 23 { 24 Console.WriteLine("這裏是異步多線程開始調用......"); 25 }); 26 //若是在task後面不加await,則只能當成普通方法使用,且不會有線程等待 27 Console.WriteLine("開始執行後..."); 28 } 29 #endregion 30 31 #region 異步方法await+async 32 public static void Invoke() 33 { 34 AwaitShow();// 這裏執行異步方法 35 //在上面的AwaitShow()用await task等待的時候,這裏主線程開始執行下面的任務 36 for (int i = 0; i < 8; i++) 37 { 38 Console.WriteLine($"這裏由主線程來執行,當前線程ID爲:{Thread.CurrentThread.ManagedThreadId}......"); 39 } 40 } 41 42 public static async void AwaitShow() 43 { 44 Console.WriteLine($"開始執行前,當前線程id:{Thread.CurrentThread.ManagedThreadId}..."); 45 Task task = Task.Run(() => 46 { 47 Console.WriteLine($"這裏是異步多線程開始調用1,當前線程ID爲:{Thread.CurrentThread.ManagedThreadId}......"); 48 Thread.Sleep(2000); 49 Console.WriteLine($"這裏是異步多線程開始調用2,當前線程ID爲:{Thread.CurrentThread.ManagedThreadId}......"); 50 }); 51 await task; //主線程到這裏就返回到上面的Invoke()方法中,去執行別的任務去了 52 53 //後面的這句話當成了一個委託,task的回調函數了,等到task子線程執行完後執行這句話 54 //這個回調線程是不肯定的,能夠是主線程,也能夠是子線程 55 Console.WriteLine($"開始執行後,當前線程id:{Thread.CurrentThread.ManagedThreadId}..."); 56 } 57 #endregion 58 59 60 #region 帶返回值得async異步方法,沒有return語句,反人類 61 public static async Task NoReturnTask() 62 { 63 Console.WriteLine($"開始執行前,當前線程id:{Thread.CurrentThread.ManagedThreadId}..."); 64 Task task= Task.Run(() => 65 { 66 Console.WriteLine($"這裏是異步多線程開始調用1,當前線程ID爲:{Thread.CurrentThread.ManagedThreadId}......"); 67 Thread.Sleep(2000); 68 Console.WriteLine($"這裏是異步多線程開始調用2,當前線程ID爲:{Thread.CurrentThread.ManagedThreadId}......"); 69 }); 70 await task; //在這裏直接返回task,吊不弔 71 72 //注:這裏至關沒有返回值,最好不要用void類型,可用Task類型 73 } 74 #endregion 75 76 #region 更反人類的返回類型 77 public static async Task<long> SumAsync() 78 { 79 Console.WriteLine($"開始執行前,當前線程id:{Thread.CurrentThread.ManagedThreadId}..."); 80 long sum = 0; 81 await Task.Run(() => 82 { 83 for (int i = 0; i < 10000000; i++) 84 { 85 sum += i; 86 } 87 }); 88 Console.WriteLine($"開始執行後,當前線程id:{Thread.CurrentThread.ManagedThreadId}..."); 89 return sum; //返回類型明明是Task<long>類型,但返回值倒是long類型,就像返回一個委託同樣 90 91 //若是要返回一個類型值,請用Task<T> 至關於委託 92 } 93 #endregion 94 } 95 }
主程序調用多線程
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 異步 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 AwaitAsyncShow.Invoke(); 14 15 //這裏調用帶返回值的async方法 16 Task<long> sumTask = AwaitAsyncShow.SumAsync(); 17 long result = sumTask.Result; 18 Console.WriteLine($"sum結果爲:{result}"); 19 Console.ReadLine(); 20 } 21 } 22 }
執行結果異步