.net中Task.WaitAll和WaitAny同步的等待Task完成
前面讲了《.net中async/await异步编程》,如果方法中使用了多个异步方法,该如何同步的等待Task完成?
Task.WaitAll 等待提供的所有 System.Threading.Tasks.Task 对象完成执行过程。
DownLoadTest dwtest = new DownLoadTest();
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
var task1 = dwtest.DoRunTaskAsync("https://stackoverflow.com/", token);
var task2 = dwtest.DoRunTaskAsync("https://github.com/", token);
var task3 = dwtest.DoRunTaskAsync("https://www.google.com/", token);
Task[] tasks = new Task[] { task1, task2 , task3 };
Debug.WriteLine("task.Result等待结果打印");
Task.WaitAll(tasks,10000);
cts.Cancel();//超过10s时间取消运行
Console.WriteLine(task1.Status);
Console.WriteLine(task2.Status);
Console.WriteLine(task3.Status);
Debug.WriteLine(string.Format("主线程运行结束"));
Console.ReadKey();
PS:DownLoadTest中的代码查看前面的文章。执行结果为:
下载https://stackoverflow.com/开始运行 : 1ms
下载https://github.com/开始运行 : 66ms
下载https://www.google.com/开始运行 : 68ms
task.Result等待结果打印
下载https://github.com/运行结束 :2,484ms
下载https://stackoverflow.com/运行结束 :2,571ms
取消https://www.google.com/的运行 :10,074ms
主线程运行结束
控制器打印出来的为
可以看出Task.WaitAll实现了多个异步方法的执行,它有多个重载方法,可以查看.NET帮助文档
Task.WaitAny可以实现等待至少一个任务的完成。修改代码如下:
DownLoadTest dwtest = new DownLoadTest();
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
var task1 = dwtest.DoRunTaskAsync("https://stackoverflow.com/", token);
var task2 = dwtest.DoRunTaskAsync("https://github.com/", token);
var task3 = dwtest.DoRunTaskAsync("https://www.google.com/", token);
Task[] tasks = new Task[] { task1, task2 , task3 };
Debug.WriteLine("task.Result等待结果打印");
Task.WaitAny(tasks,10000);
cts.Cancel();//超过10s时间取消运行
Debug.WriteLine(task1.Status);
Debug.WriteLine(task2.Status);
Debug.WriteLine(task3.Status);
Debug.WriteLine(string.Format("主线程运行结束"));
Console.ReadKey();
Output输出窗口结果为:
下载https://stackoverflow.com/开始运行 : 1ms
下载https://github.com/开始运行 : 52ms
下载https://www.google.com/开始运行 : 53ms
task.Result等待结果打印
下载https://github.com/运行结束 :1,994ms
WaitingForActivation
RanToCompletion
WaitingForActivation
主线程运行结束
取消https://stackoverflow.com/的运行 :1,997ms
取消https://www.google.com/的运行 :1,997ms
可以看到https://github.com/先下载完,就会执行,取消了其它两个的下载。它有多个重载方法,可以查看.NET帮助文档