zoukankan      html  css  js  c++  java
  • .net中Task.WhenAll和WhenAny异步的等待Task完成

    前面讲了Task.WaitAll和WaitAny同步的等待Task完成,在异步方法中,我们希望用await表达式等待Task,这里使用Task.WhenAll和WhenAny方法来实现等待一个或者多个任务完成。

    修改Main函数,添加一个异步方法,代码如下:

    static void Main(string[] args)
    {
        string[] urls = { "https://stackoverflow.com/" , "https://github.com/" };
        var task = DoRunsAsync(urls);
        task.Wait();
        Debug.WriteLine(string.Format("主线程运行结束"));
        Console.ReadKey();
    }
    private static async Task<string> DoRunsAsync(IEnumerable<string> urls)
    {
        DownLoadTest dwtest = new DownLoadTest();
        List<Task> tasks = new List<Task>();
        foreach (var url in urls)
        {
            var task = dwtest.DoRunStringAsync(url);
            Debug.WriteLine("task.Id =" + task.Id + "  url=" + url);
            tasks.Add(task);
        }
        await Task.WhenAll(tasks);
        foreach (var task in tasks)
        {
            Debug.WriteLine("task.Id =" + task.Id + "  task.Status=" + task.Status);
        }
        return "";
    }

    执行结果如下:

    异步程序获取https://stackoverflow.com/开始运行:   1ms
    task.Id =3  url=https://stackoverflow.com/
    异步程序获取https://github.com/开始运行:  50ms
    下载https://stackoverflow.com/开始运行 :  51ms
    下载https://github.com/开始运行 :  51ms
    task.Id =6  url=https://github.com/
    下载https://stackoverflow.com/运行结束 :1,965ms
    异步程序获取https://stackoverflow.com/运行结束:1,966ms
    下载https://github.com/运行结束 :1,995ms
    异步程序获取https://github.com/运行结束:1,996ms
    task.Id =3  task.Status=RanToCompletion
    task.Id =6  task.Status=RanToCompletion
    主线程运行结束

    可以看到await Task.WhenAll(tasks);异步等待了所有的任务完成。

    我们使用Task.WhenAny来看看效果:

    static void Main(string[] args)
    {
        string[] urls = { "https://stackoverflow.com/" , "https://github.com/" };
        var task = DoRunsAsync(urls);
        task.Wait();
        Debug.WriteLine(string.Format("主线程运行结束"));
        Console.ReadKey();
    }
    private static async Task<string> DoRunsAsync(IEnumerable<string> urls)
    {
        DownLoadTest dwtest = new DownLoadTest();
        List<Task> tasks = new List<Task>();
        foreach (var url in urls)
        {
            var task = dwtest.DoRunStringAsync(url);
            Debug.WriteLine("task.Id =" + task.Id + "  url=" + url);
            tasks.Add(task);
        }
        await Task.WhenAny(tasks);
        foreach (var task in tasks)
        {
            Debug.WriteLine("task.Id =" + task.Id + "  task.Status=" + task.Status);
        }
        return "";
    }

    运行结果如下:

    异步程序获取https://stackoverflow.com/开始运行:   1ms
    task.Id =3  url=https://stackoverflow.com/
    异步程序获取https://github.com/开始运行:  52ms
    下载https://stackoverflow.com/开始运行 :  52ms
    task.Id =6  url=https://github.com/
    下载https://github.com/开始运行 :  53ms
    下载https://github.com/运行结束 :1,892ms
    异步程序获取https://github.com/运行结束:1,893ms
    task.Id =3  task.Status=WaitingForActivation
    task.Id =6  task.Status=RanToCompletion
    主线程运行结束
    下载https://stackoverflow.com/运行结束 :5,009ms
    异步程序获取https://stackoverflow.com/运行结束:5,010ms
    可以看到,Task.WhenAny(tasks)至少等待了一个任务的完成。这里https://github.com/先下载完,就直接终止等待


  • 相关阅读:
    【annoy】高维空间求近似最近邻
    【tf安装版本】linux安装tensorflow,和cuda, cudnn版本对应关系
    【pip】国内镜像地址
    【linux】文件压缩分包与批量解压
    【腾讯词向量】腾讯中文预训练词向量
    【数据集】中文语音识别可用的开源数据集整理
    【模型部署】使用Flask部署算法模型
    【debug】python在import Flask的时候报错cannot import name 'dump_age'
    【敏感词检测】用DFA构建字典树完成敏感词检测任务
    2021年最新JAVA基础面试题共91道含答案(二)图灵学院
  • 原文地址:https://www.cnblogs.com/hueychan/p/10575910.html
Copyright © 2011-2022 走看看