多线程(5)async&await
2018-06-18 04:12:29来源:未知 阅读 ()
.net 4.0的Task已经让我们可以非常简单地使用多线程,并且可以有返回值,也可以支持线程的取消等操作,可谓已经很强大了。但.net 4.5为我们带来了async&await,使得实现多线程的写法更简单,更优美,更符合线性思维。
下面通过一个例子来演示通过Task和async&await分别如何实现,并且最后还附上代码执行顺序图。
使用Task实现
如下代码:
1 #region 使用Task实现 2 static void TestByTask() 3 { 4 Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId); 5 var task = Task.Factory.StartNew<string>(() => 6 { 7 return GetNameByTask(); 8 }); 9 Console.WriteLine("get another thread result,result:" + task.Result); 10 Console.WriteLine("main thread completed!"); 11 } 12 13 static string GetNameByTask() 14 { 15 Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId); 16 return "mcgrady"; 17 } 18 #endregion
输出结果:
使用async&await实现
假如使用async&await如何实现呢,如下代码:
1 #region 使用async&await实现 2 static async void TestByAsyncAwait() 3 { 4 Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId); 5 var name = GetNameByAsyncAwait(); 6 7 Console.WriteLine(string.Format("get another thread result,result:{0}", await name)); 8 Console.WriteLine("main thread completed!"); 9 } 10 11 static async Task<string> GetNameByAsyncAwait() 12 { 13 return await Task.Factory.StartNew<string>(() => 14 { 15 Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId); 16 return "mcgrady"; 17 }); 18 } 19 #endregion
输出结果:
输出结果跟使用Task相同。
代码执行流程如下图:
完整代码:
1 namespace ConsoleApplication25 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 //1,使用task实现 8 //TestByTask(); 9 10 //2,使用async&await实现 11 TestByAsyncAwait(); 12 13 Console.ReadKey(); 14 } 15 16 #region 使用Task实现 17 static void TestByTask() 18 { 19 Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId); 20 var task = Task.Factory.StartNew<string>(() => 21 { 22 return GetNameByTask(); 23 }); 24 Console.WriteLine("get another thread result,result:" + task.Result); 25 Console.WriteLine("main thread completed!"); 26 } 27 28 static string GetNameByTask() 29 { 30 Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId); 31 return "mcgrady"; 32 } 33 #endregion 34 35 #region 使用async&await实现 36 static async void TestByAsyncAwait() 37 { 38 Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId); 39 var name = GetNameByAsyncAwait(); 40 41 Console.WriteLine(string.Format("get another thread result,result:{0}", await name)); 42 Console.WriteLine("main thread completed!"); 43 } 44 45 static async Task<string> GetNameByAsyncAwait() 46 { 47 return await Task.Factory.StartNew<string>(() => 48 { 49 Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId); 50 return "mcgrady"; 51 }); 52 } 53 #endregion 54 } 55 }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 最详细的java多线程教程来了 2020-06-08
- 系统化学习多线程(一) 2020-06-08
- Invalid [xxx] in servlet mapping 、 <url-pattern& 2020-06-07
- 错误: 在类中找不到 main 方法, 请将 main 方法定义为: & 2020-06-06
- 多线程:生产者消费者(管程法、信号灯法) 2020-06-01
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