1. 方法名前只有async,但是方法中Task实例前没有await关键字,该方法和普通方法没有什么区别,但是会报一个警告。
1 #region 情况一 2 /// <summary> 3 /// 当只有async,没有await时,方法会有个警告 4 /// 和普通的多线程方法没有什么区别 5 /// </summary> 6 private static async void Test1() 7 { 8 //主线程执行 9 Console.WriteLine("主线程{0}开始:", Thread.CurrentThread.ManagedThreadId); 10 //启动新线程完成任务 11 Task task = Task.Run(() => 12 { 13 Console.WriteLine("子线程{0}开始:", Thread.CurrentThread.ManagedThreadId); 14 Thread.Sleep(3000); 15 Console.WriteLine("子线程{0}结束:", Thread.CurrentThread.ManagedThreadId); 16 }); 17 //主线程执行 18 Console.WriteLine("主线程{0}结束:", Thread.CurrentThread.ManagedThreadId); 19 } 20 #endregion
结果:
2. 用法:方法名前加async,如果方法无返回值,用async Task 代替async void ,await放到Task实例前面,表示执行完Task线程后,方可执行后面的操作。
1 #region 情况三 2 /// <summary> 3 /// 无返回值 async Task == async void 4 /// Task和Task<T>能够使用await, Task.WhenAny, Task.WhenAll等方式组合使用,async Void 不行 5 /// </summary> 6 private static async Task Test3() 7 { 8 //主线程执行 9 Console.WriteLine("主线程{0}开始:", Thread.CurrentThread.ManagedThreadId); 10 //启动新线程完成任务 11 Task task = Task.Run(() => 12 { 13 Console.WriteLine("子线程{0}开始:", Thread.CurrentThread.ManagedThreadId); 14 Thread.Sleep(3000); 15 Console.WriteLine("子线程{0}结束:", Thread.CurrentThread.ManagedThreadId); 16 }); 17 await task; //等待子线程执行完毕,方可执行后面的语句 18 Console.WriteLine("主线程{0}结束:", Thread.CurrentThread.ManagedThreadId); 19 } 20 #endregion
结果:
3.带返回值的Task,要使用返回值,一定要等子线程计算完毕才行
1 #region 情况四 2 /// <summary> 3 /// 带返回值的Task,要使用返回值,一定要等子线程计算完毕才行 4 /// </summary> 5 /// <returns></returns> 6 private static async Task<long> Test4() 7 { 8 //主线程执行 9 Console.WriteLine("主线程{0}开始:", Thread.CurrentThread.ManagedThreadId); 10 long result = 0; 11 //启动新线程完成任务 12 Task task = Task.Run(() => 13 { 14 for (long i = 0; i < 100; i++) 15 { 16 result += i; 17 } 18 }); 19 await task; //等待子线程执行完毕,方可执行后面的语句 20 Console.WriteLine("主线程{0}结束:", Thread.CurrentThread.ManagedThreadId); 21 Console.WriteLine("result:{0}", result); 22 return result; 23 } 24 #endregion
结果: