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

  • 相关阅读:
    SQL性能优化思路
    EF Migraiton错误解决
    How to resolve the 403 error when send POST request from Postman
    Disable trigger to avoid the ID is auto-updated
    MBG(Mybatis Generator)配置
    Publish Web Site To IIS From VS
    quickSort算法导论版实现
    Clang与libc++abi库安装
    Clang与libc++abi库安装
    整数中1 的个数
  • 原文地址:https://www.cnblogs.com/hueychan/p/10575911.html
Copyright © 2020-2023  润新知