.NET Task的新认识
来源:互联网 发布:js 设置控件不可用 编辑:程序博客网 时间:2024/04/30 14:42
当使用Task时,如果Task的实现(即代理)本身也是异步的,则Wait()会失效。
1. Wait()有效,Task的实现(即代理)本身非异步
private async void btn_task1_Click(object sender, RoutedEventArgs e){ this.WriteLine("btn_task1_Click++++++++++++++++++++"); Task t1 = new Task(() =>// 使用for模拟延时 { this.WriteLine("Task 1 running.."); for (long i = 0; i < 0xfffffff; i++) ; this.WriteLine("Task 1 end"); }); this.WriteLine("Task 1 start"); t1.Start(); this.WriteLine("Task 1 wait start"); t1.Wait();// 生效 this.WriteLine("Task 1 wait end"); this.WriteLine("btn_task1_Click delay 3s"); await Task.Delay(3000); this.WriteLine("btn_task1_Click--------------------------------------");}2. Wait()失效,Task的实现(即代理)本身是异步
private async void btn_task2_Click(object sender, RoutedEventArgs e){ this.WriteLine("btn_task2_Click++++++++++++++++++++"); Task t2 = new Task(async () =>// 使用Task.Delay延时,但Task.Delay是可等待的(即异步) { this.WriteLine("Task 2 running.."); await Task.Delay(2000); this.WriteLine("Task 2 end"); }); this.WriteLine("Task 2 start"); t2.Start(); this.WriteLine("Task 2 wait start"); t2.Wait();// Wait()失效 this.WriteLine("Task 2 wait end"); this.WriteLine("btn_task2_Click delay 3s"); await Task.Delay(3000); this.WriteLine("btn_task2_Click--------------------------------------");}
解决异步和可等待:
如果想让Wait()有效,而Task的实现(即代理)本身又是异步的,我们只能使用Task.Run(Func<Task> function):
private async void btn_task3_Click(object sender, RoutedEventArgs e){ this.WriteLine("btn_task3_Click++++++++++++++++++++"); Task t3 = Task.Run(async () =>//Task.Run()创建的Task涉及到一个异步链的问题,当使用了Wait()的时候,它会等Task.Run()里面的异步执行完。 { this.WriteLine("Task 3 running.."); await Task.Delay(2000); this.WriteLine("Task 3 end"); }); this.WriteLine("Task 3 wait"); t3.Wait();// 有效 this.WriteLine("btn_task3_Click delay 3s"); await Task.Delay(3000); this.WriteLine("btn_task3_Click--------------------------------------");}
0 0
- .NET Task的新认识
- 对ASP.NET Cookie的一些新的认识
- 对ASP.NET Cookie的一些新的认识
- 对ASP.NET Cookie的一些新的认识
- 对ASP.NET Cookie的一些新的认识
- 对ASP.NET Cookie的一些新的认识
- 对ASP.NET Cookie的一些新的认识
- android 开启新的task
- 工作流的新认识
- Yahoo!--新的认识
- 《大话西游》的新认识
- 认识新的朋友
- UML的新认识
- php的新认识
- const的新认识
- ./configure 的新认识
- 认识新的二极管
- SVN 新的认识
- If-else与三目运算符的区别
- CentOS 7&RHEL7重置root密码
- 文件与目录操作
- poj 3624 Charm Bracelet
- ThreadLocal 和神奇的 0x61c88647
- .NET Task的新认识
- 数据库常考笔试题
- 626B-Cards
- Pentest - psmsf
- neuq oj 1050: 谭浩强C语言(第三版)习题6.6 C++
- nyist 49 开心的小明(01背包)
- web学习博客2016/2/20
- python的邮箱正则的一些改进
- String、StringBuffer与StringBuilder之间区别