.NET Task的新认识
2016-02-21 00:07
295 查看
当使用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的实现(即代理)本身是异步
解决异步和可等待:
如果想让Wait()有效,而Task的实现(即代理)本身又是异步的,我们只能使用Task.Run(Func<Task> function):
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--------------------------------------"); }
相关文章推荐
- .NET中的async和await关键字使用及Task异步调用实例
- 深入多线程之:Wait与Pulse的使用详解
- 配置Grunt的Task时通配符支持和动态生成文件名问题
- Java的wait(), notify()和notifyAll()使用心得
- Java线程中sleep和wait的区别详细介绍
- 深入探讨:unix多进程编程之wait()与waitpid()函数
- c#异步task示例分享(异步操作)
- 深入多线程之:用Wait与Pulse模拟一些同步构造的应用详解
- C#中sleep和wait的区别分析
- 详细分析java线程wait和notify
- Thread Signaling
- Android 复习_Task 与 Back Stack
- Android下Affinities和Task
- Linux进程状态解析之R、S、D、T、Z
- java wait notify
- 深入理解Oracle中的latch
- wait status
- sleep与wait
- Java notify、notifyAll,wait的描述
- 多线程 wait sleep synchronized