公司项目里频繁使用Async Await,所以最近几天看了一些Async/Await的一些文章和教程,有些理解也有些疑惑,先记录下。
控制台示例:
1 static void Main(string[] args) 2 { 3 Console.WriteLine("主线程:" + Thread.CurrentThread.ManagedThreadId); 4 TestAsync(); 5 Console.WriteLine("GetInfoAsync后 调用线程:" + Thread.CurrentThread.ManagedThreadId); 6 Thread.Sleep(5000); 7 Console.ReadLine(); 8 } 9 public async static Task TestAsync() { 10 Console.WriteLine("await1前 调用线程:" + Thread.CurrentThread.ManagedThreadId); 11 await Task.Run(()=> { 12 Console.WriteLine("await1 调用线程:" + Thread.CurrentThread.ManagedThreadId); 13 Thread.Sleep(5000); 14 }); 15 Console.WriteLine("await1后 调用线程:" + Thread.CurrentThread.ManagedThreadId); 16 await Task.Run(() => { 17 Console.WriteLine("await2 调用线程:" + Thread.CurrentThread.ManagedThreadId); 18 Thread.Sleep(5000); 19 }); 20 Console.WriteLine("await2后 调用线程:" + Thread.CurrentThread.ManagedThreadId); 21 }
运行结果:
通过运行结果可以看出代码的运行顺序。主线程会进入TestAsync方法,此时并没有异步。
当主线程1遇到第一个await时,一方面主线程1会返回Main方法继续执行后边的代码,另一方面会有新线程3执行await关键字后边的代码,两方面互不影响,并行运行。
await关键字后边的 Task.Run本身就是个异步方法,会有新线程执行。
await起到的作用是释放主线程、等待异步方法(await关键字后边的Task.Run)执行结束。
异步方法(await关键字后边的Task.Run)执行结束后,(从运行结果看还是执行Task.Run的线程3)会继续执行后续代码。
执行到第二个await时也是释放当前线程3,await等待新线程4执行异步方法Task.Run,异步方法执行结束后线程4继续执行后续代码。
不使用async await时,也运行下用以比较:
1 static void Main(string[] args) 2 { 3 Console.WriteLine("主线程:" + Thread.CurrentThread.ManagedThreadId); 4 Test(); 5 Console.WriteLine("GetInfoAsync后 调用线程:" + Thread.CurrentThread.ManagedThreadId); 6 Thread.Sleep(5000); 7 Console.ReadLine(); 8 } 9 10 public static void Test() { 11 Console.WriteLine("await1前 调用线程:" + Thread.CurrentThread.ManagedThreadId); 12 Task.Run(() => { 13 Console.WriteLine("await1 调用线程:" + Thread.CurrentThread.ManagedThreadId); 14 Thread.Sleep(5000); 15 }); 16 Console.WriteLine("await1后 调用线程:" + Thread.CurrentThread.ManagedThreadId); 17 Task.Run(() => { 18 Console.WriteLine("await2 调用线程:" + Thread.CurrentThread.ManagedThreadId); 19 Thread.Sleep(5000); 20 }); 21 Console.WriteLine("await2后 调用线程:" + Thread.CurrentThread.ManagedThreadId); 22 }
运行结果:
总结:
1,await关键字可以使后边代码异步,不阻塞主线程
2,用同步方式(看起来是同步,执行顺序一目了然)写异步代码
3,频繁释放线程,增加程序吞吐性
4,asp.net程序、winform和WPF程序会有死锁问题
5,底层原理可反编译查看
6,C#5.0语法糖
疑惑:一个asnyc方法里写多个await有什么意义
标签:await,Console,CurrentThread,Thread,C#,Await,线程,WriteLine,Async From: https://www.cnblogs.com/returnfalse/p/16945463.html