同步异步 Await Async

  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 AwaitAsyncLibrary
  9 {
 10     /// <summary>
 11     /// await/async关键字
 12     /// 任何一个方法 都可以增加async
 13     /// await 放在task前面     
 14     /// 一般成对出现  只有async是没有意义的,有警告
 15     ///               只有await是报错的,编译直接报错
 16     /// await/async 要么不用  要么用到底
 17     /// </summary>
 18     public class AwaitAsyncClass
 19     {
 20         public static void TestShow()
 21         {
 22             Test();
 23         }
 24 
 25 
 26         private async static Task Test()
 27         {
 28             Console.WriteLine($"当前主线程id={Thread.CurrentThread.ManagedThreadId.ToString("00")}");
 29             {
 30                 //NoReturnNoAwait();
 31             }
 32             {
 33                 //NoReturn();
 34                 //for (int i = 0; i < 10; i++)
 35                 //{
 36                 //    Thread.Sleep(300);
 37                 //    Console.WriteLine($"Main Thread Task ManagedThreadId={Thread.CurrentThread.ManagedThreadId.ToString("00")} i={i}");
 38                 //}
 39             }
 40             {
 41                 //Task t = NoReturnTask();
 42                 //Console.WriteLine($"Main Thread Task ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
 43                 //t.Wait();//主线程等待Task的完成  阻塞的
 44                 //await t;//await后的代码会由线程池的线程执行  非阻塞
 45             }
 46             {
 47                 Task<long> t = SumAsync();
 48                 Console.WriteLine($"Main Thread Task ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
 49                 long lResult = t.Result;//访问result   主线程等待Task的完成
 50                 t.Wait();//等价于上一行
 51             }
 52             {
 53                 //Task<int> t = SumFactory();
 54                 //Console.WriteLine($"Main Thread Task ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
 55                 //long lResult = t.Result;//没有await和async 普通的task
 56                 //t.Wait();
 57             }
 58             //Console.WriteLine($"Test Sleep Start {Thread.CurrentThread.ManagedThreadId}");
 59             //Thread.Sleep(10000);
 60             //Console.WriteLine($"Test Sleep End {Thread.CurrentThread.ManagedThreadId}");
 61             Console.WriteLine($"Main Thread Task ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
 62             Console.Read();
 63         }
 64 
 65         /// <summary>
 66         /// 只有async没有await,会有个warn
 67         /// 跟普通方法没有区别
 68         /// </summary>
 69         private static async void NoReturnNoAwait()
 70         {
 71             //主线程执行
 72             Console.WriteLine($"NoReturnNoAwait Sleep before Task,ThreadId={Thread.CurrentThread.ManagedThreadId}");
 73             Task task = Task.Run(() =>//启动新线程完成任务
 74             {
 75                 Console.WriteLine($"NoReturnNoAwait Sleep before,ThreadId={Thread.CurrentThread.ManagedThreadId}");
 76                 Thread.Sleep(3000);
 77                 Console.WriteLine($"NoReturnNoAwait Sleep after,ThreadId={Thread.CurrentThread.ManagedThreadId}");
 78             });
 79 
 80             //主线程执行
 81             Console.WriteLine($"NoReturnNoAwait Sleep after Task,ThreadId={Thread.CurrentThread.ManagedThreadId}");
 82         }
 83 
 84         /// <summary>
 85         /// async/await 
 86         /// 不能单独await
 87         /// await 只能放在task前面
 88         /// 不推荐void返回值,使用Task来代替
 89         /// Task和Task<T>能够使用await, Task.WhenAny, Task.WhenAll等方式组合使用。Async Void 不行
 90         /// </summary>
 91         private static async void NoReturn()
 92         {
 93             //主线程执行
 94             Console.WriteLine($"NoReturn Sleep before await,ThreadId={Thread.CurrentThread.ManagedThreadId}");
 95             TaskFactory taskFactory = new TaskFactory();
 96             Task task = taskFactory.StartNew(() =>
 97             {
 98                 Console.WriteLine($"NoReturn Sleep before,ThreadId={Thread.CurrentThread.ManagedThreadId}");
 99                 Thread.Sleep(3000);
100                 Console.WriteLine($"NoReturn Sleep after,ThreadId={Thread.CurrentThread.ManagedThreadId}");
101             });
102 
103             //task.ContinueWith(t =>
104             //{
105             //    Console.WriteLine($"NoReturn Sleep after await,ThreadId={Thread.CurrentThread.ManagedThreadId}");
106             //});
107             await task;//主线程到这里就返回了,执行主线程任务
108             Console.WriteLine($"NoReturn Sleep after await,ThreadId={Thread.CurrentThread.ManagedThreadId}");
109             //一流水儿的写下去的,耗时任务就用await
110             //nodejs
111             //子线程执行   其实是封装成委托,在task之后成为回调(编译器功能  状态机实现)
112             //task.ContinueWith()
113             //这个回调的线程是不确定的:可能是主线程  可能是子线程  也可能是其他线程
114         }
115 
116         /// <summary>
117         /// 无返回值  async Task == async void
118         /// Task和Task<T>能够使用await, Task.WhenAny, Task.WhenAll等方式组合使用。Async Void 不行
119         /// </summary>
120         /// <returns></returns>
121         private static async Task NoReturnTask()
122         {
123             //这里还是主线程的id
124             Console.WriteLine($"NoReturnTask Sleep before await,ThreadId={Thread.CurrentThread.ManagedThreadId}");
125 
126             Task task = Task.Run(() =>
127              {
128                  Console.WriteLine($"NoReturnTask Sleep before,ThreadId={Thread.CurrentThread.ManagedThreadId}");
129                  Thread.Sleep(3000);
130                  Console.WriteLine($"NoReturnTask Sleep after,ThreadId={Thread.CurrentThread.ManagedThreadId}");
131              });
132             await task;
133             Console.WriteLine($"NoReturnTask Sleep after await,ThreadId={Thread.CurrentThread.ManagedThreadId}");
134 
135             //return new TaskFactory().StartNew(() => { });  //不能return  没有async才行
136         }
137 
138         /// <summary>
139         /// 带返回值的Task  
140         /// 要使用返回值就一定要等子线程计算完毕
141         /// </summary>
142         /// <returns>async 就只返回long</returns>
143         private static async Task<long> SumAsync()
144         {
145             Console.WriteLine($"SumAsync 111 start ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
146             long result = 0;
147 
148             await Task.Run(() =>
149             {
150                 for (int k = 0; k < 10; k++)
151                 {
152                     Console.WriteLine($"SumAsync {k} await Task.Run ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
153                     Thread.Sleep(1000);
154                 }
155                 for (long i = 0; i < 999_999_999; i++)
156                 {
157                     result += i;
158                 }
159             });
160 
161             Console.WriteLine($"SumFactory 111   end ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
162             await Task.Run(() =>
163             {
164                 for (int k = 0; k < 10; k++)
165                 {
166                     Console.WriteLine($"SumAsync {k} await Task.Run ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
167                     Thread.Sleep(1000);
168                 }
169                 for (long i = 0; i < 999999999; i++)
170                 {
171                     result += i;
172                 }
173             });
174 
175             Console.WriteLine($"SumFactory 111   end ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
176 
177             await Task.Run(() =>
178             {
179                 for (int k = 0; k < 10; k++)
180                 {
181                     Console.WriteLine($"SumAsync {k} await Task.Run ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
182                     Thread.Sleep(1000);
183                 }
184 
185                 for (long i = 0; i < 999999999; i++)
186                 {
187                     result += i;
188                 }
189             });
190 
191             Console.WriteLine($"SumFactory 111   end ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
192 
193             return result;
194         }
195 
196         /// <summary>
197         /// 真的返回Task  不是async  
198         /// 
199         /// 要使用返回值就一定要等子线程计算完毕
200         /// </summary>
201         /// <returns>没有async Task</returns>
202         private static Task<int> SumFactory()
203         {
204             Console.WriteLine($"SumFactory 111 start ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
205             TaskFactory taskFactory = new TaskFactory();
206             Task<int> iResult = taskFactory.StartNew<int>(() =>
207             {
208                 Thread.Sleep(3000);
209                 Console.WriteLine($"SumFactory 123 Task.Run ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
210                 return 123;
211             });
212             //Console.WriteLine($"This is {iResult.Result}");
213             Console.WriteLine($"SumFactory 111   end ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
214             return iResult;
215         }
216     }
217 }

 

posted @ 2021-01-17 20:11  YZM_Leo  阅读(164)  评论(0)    收藏  举报