• C#学习:异步模式_Task.WhenAny和Task.WhenAll


    C#的CLR(即 common language runtime,公共语言运行库)包含两种任务组合器:Task.WhenAnyTask.WhenAll

    我们先定义如下方法:

    async Task<int> Delay1()
    {
        await Task.Delay(1000);
        return 1;
    }
    async Task<int> Delay2()
    {
        await Task.Delay(2000);
        return 2;
    }
    async Task<int> Delay3()
    {
        await Task.Delay(3000);
        return 3;
    }
    
    Task.WhenAny

    Task.WhenAny方法会在任务组中的任意一个任务完成时返回这个任务。
    如下任务会在一秒钟完成:

    Task<int> winningTask = await Task.WhenAny(Delay1(), Delay2(), Delay3());
    Console.WriteLine("Done");
    Console.WriteLine(winningTask.Result);
    

    我们等待的Task.WhenAny返回的任务将会是所有任务中第一个完成的任务。
    上述示例是非阻塞的,但即便如此,也建议对winningTask进行await等待操作,因为这样做的话,如果有一个并非第一个结束的任务发生了失败,我们没有等待,那这个异常将会成为未观测的异常。

    Task.WhenAll

    Task.WhenAll返回一个任务,该任务仅当参数中所有任务全部完成时才完成。
    如下任务会在三秒钟完成:

    await Task.WhenAll(Delay1(), Delay2(), Delay3());
    

    若不用WhenAll依次等待,则可以得到相似结果:

    Task task1 = Delay1(), task2 = Delay2(), task3 = Delay3();
    await task1;
    await task2;
    await task3;
    

    三次等待的效率一般来说低于一次等待。还有,如果task1出错,那么就无法等待task2和task3,导致如果他们中间发生异常成为未观测异常。

    如果多个任务发生了错误,那么这些异常会组合到任务的AggregateException中。但是如果等待该组合任务的话,则只会抛出第一个异常。
    如果查看所有异常,应用以下写法:

    Task task1 = Task.Run(() => { throw null; });
    Task task2 = Task.Run(() => { throw null; });
    Task all = Task.WhenAll(task1, task2);
    try
    {
        await all;
    }
    catch
    {
        Console.WriteLine(all.Exception.InnerExceptions.Count);   // 2 
    }
    
    

    对一系列Task<TResult>任务调用WhenAll会返回一个Task<TResult[]>,即所有任务的结果组合。
    如下示例:

    Task<int> task1 = Task.Run(() => 1);
    Task<int> task2 = Task.Run(() => 2);
    int[] results = await Task.WhenAll(task1, task2);   // { 1, 2 }	
    
  • 相关阅读:
    Android打包报错 Export aborted because fatal lint errors were found. These are listed in the Lint View
    jqMobi 更小更快的移动框架
    php报错:Call to undefined function get_magic_quotes_gpc()
    php:字符窜截取substr和mb_substr
    Warning Creating default object from empty value in xxx.php
    linux下安装xampp
    程序员找不女朋友的原因
    键盘各种按键对应的ASII码
    Read All About It-Attraction舞团
    What are words-Chris Medina
  • 原文地址:https://www.cnblogs.com/nullcodeworld/p/16421316.html
Copyright © 2020-2023  润新知