.Net进阶系列(14)-异步多线程(async和await)(被替换)

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

结果:

 

posted @ 2017-06-23 20:02  Yaopengfei  阅读(414)  评论(0编辑  收藏  举报