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 }