小结: Async & Await
2018-06-17 19:49:57来源:未知 阅读 ()
新项目组用到Async & Await, 关于Await会不会新开不开线程,遇到什么情况会新开线程的问题网上查了很多资料都没看到直观的解释。现简单总结一下。
直接上代码:
namespace ConsoleApplication2 { class Program { static void Main(string[] args) { Test(); Console.WriteLine("Current Thread Id1 :{0}", Thread.CurrentThread.ManagedThreadId); Console.ReadKey(); } static async Task Test() { await Task.Run(new Action(GetName)); //Await 在这里必须搭配Task的新开线程方法使用,并且表示从这一行开始的剩余code在新线程中执行,并告诉Main线程继续往下执行。 Console.WriteLine("Current Thread Id2 :{0}", Thread.CurrentThread.ManagedThreadId); } public static void GetName() { for(int i=0; i<1000000000;i++) { int a = 15*15*15*15*15*15; } Console.WriteLine("Current Thread Id3 :{0}", Thread.CurrentThread.ManagedThreadId); } } }
结果如下
Current Thread Id1 :9
Current Thread Id3 :10
Current Thread Id2 :10
为了验证await是不是遇到新开启线程的方法才会触发他的作用,做如下更改。
namespace ConsoleApplication2 { class Program { static void Main(string[] args) { Test(); Console.WriteLine("Current Thread Id1 :{0}", Thread.CurrentThread.ManagedThreadId); Console.ReadKey(); } static async Task Test() { await GetName(); Console.WriteLine("Current Thread Id2 :{0}", Thread.CurrentThread.ManagedThreadId); } public static async Task GetName() { for(int i=0; i<1000000000;i++) { int a = 15*15*15*15*15*15; } await Task.Delay(10000); Console.WriteLine("Current Thread Id3 :{0}", Thread.CurrentThread.ManagedThreadId); } } }
发现Main线程会等待GetName里的复杂运算结束后,知道Task.Delay才会继续执行Main线程,猜测正确。
补充一句,在第一段code中,如果在Test方法中的 await Task.Run(new Action(GetName)); 没有await, 代码跑到这里开启线程的同时Main线程会继续往下之前,因此await是包含了本行及以下的所有代码在新线程中执行,但仅限本方法及本方法调用的方法,不会进入上级方法。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Delphi XE 10.2.3使用CEF4Delphi取网页元素时碰到&n 2018-12-09
- Delphi 10.3 Rio + iOS 12.1 SDK 编译错误 "libcha 2018-11-29
- .NET “底层”异步编程模式—&a 2018-06-21
- 【转】ASP.NET"正在中止线程"错误原因 2018-06-21
- "类工厂模式"改写SqlHelper 2018-06-21
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash