ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-06-28 22:04:55  阅读:149  来源: 互联网

标签:task1 task2 Task C# await WhenAny 任务 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 }	

标签:task1,task2,Task,C#,await,WhenAny,任务,WhenAll
来源: https://www.cnblogs.com/nullcodeworld/p/16421316.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有