c# async 和 await 学习
1:下用代码验证下
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 int sum = 0; 6 Console.WriteLine("one 当前线程ID" + Thread.CurrentThread.ManagedThreadId+" 时间是"+DateTime.Now+" sum="+ sum); 7 var ret=Func(sum); 8 Console.WriteLine("three 当前线程ID" + Thread.CurrentThread.ManagedThreadId+" 时间是"+DateTime.Now+ " sum=" + sum); 9 // 10 Console.WriteLine("five 当前线程ID" + Thread.CurrentThread.ManagedThreadId + " 时间是" + DateTime.Now + " sum=" + ret.Result); 11 Console.WriteLine("此步被上一步阻塞着"); 12 Console.ReadKey(); 13 } 14 public static async Task<int> Func(int sum) 15 { 16 Console.WriteLine("two 当前线程ID" + Thread.CurrentThread.ManagedThreadId + " 时间是" + DateTime.Now + " sum=" + sum); 17 sum=await Task.Run(()=>TimeConsumingMethod(sum)) ; 18 Console.WriteLine("four 当前线程ID" + Thread.CurrentThread.ManagedThreadId + " 时间是" + DateTime.Now + " sum=" + sum); 19 return sum; 20 } 21 private static int TimeConsumingMethod(int sum) 22 { 23 for (var i = 0; i < 3; i++) 24 { 25 Thread.Sleep(1000); 26 sum = sum + i; 27 Console.WriteLine("当前线程ID" + Thread.CurrentThread.ManagedThreadId + " 时间是" + DateTime.Now + " sum=" + sum); 28 } 29 return sum; 30 } 31 }
2:结果
one 当前线程ID1 时间是2019/4/5 22:32:11 sum=0
two 当前线程ID1 时间是2019/4/5 22:32:11 sum=0
three 当前线程ID1 时间是2019/4/5 22:32:11 sum=0
当前线程ID3 时间是2019/4/5 22:32:12 sum=0
当前线程ID3 时间是2019/4/5 22:32:13 sum=1
当前线程ID3 时间是2019/4/5 22:32:14 sum=3
four 当前线程ID3 时间是2019/4/5 22:32:14 sum=3
five 当前线程ID1 时间是2019/4/5 22:32:11 sum=3
此步被上一步阻塞着
3:结论
1:async 用于修饰方法 单独修饰方法没有任何意义 和普通方法一样
2:真正的异步还是的靠Task
3:Task前加了await 的用处 await 之后到方法末尾的代码都属于Task里的线程去执行 。await 之前的代码主线程去执行
菜鸟-潜水中
浙公网安备 33010602011771号