• .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帮助文档

  • 相关阅读:
    vue父组件促发子组件中的方法
    油猴脚本:油猴脚本自动点击 | 自动检测元素并点击、休眠、顺序执行、单页面也适用
    油猴脚本:使用layer.js mobx lodash jquery
    vue项目统计src目录下代码行数
    常用mobx响应新值变化函数autorun和observe
    uni app使用mobx | uni app状态管理mobx
    File and Code Templates | webstorm代码文件模板 vue typescript
    javascript立即执行函数简单介绍
    VSCode 安装GitLens插件不生效问题
    常用的浅拷贝实现方法
  • 原文地址:https://www.cnblogs.com/hueychan/p/10575911.html
Copyright © 2020-2023  润新知