首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Task.WhenAll(taskList).Wait()是否与Task.WaitAll(taskList)相同?

Task.WhenAll(taskList).Wait()是否与Task.WaitAll(taskList)相同?
EN

Stack Overflow用户
提问于 2021-09-22 12:41:06
回答 1查看 65关注 0票数 1

这些行的行为是否完全相同(包括通过AggregateException的exactly处理)?

代码语言:javascript
复制
Task.WhenAll(taskList).Wait()
Task.WaitAll(taskList)

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-23 18:21:50

让我们通过实验来找到答案:

代码语言:javascript
复制
var task1 = Task.FromResult(13);
var task2 = Task.FromCanceled<int>(new CancellationToken(true));
var task3 = Task.FromCanceled<int>(new CancellationToken(true));
var task4 = Task.FromException<int>(new ApplicationException());
var task5 = Task.FromException<int>(new OverflowException());
Test("Successful+Canceled+Canceled", new[] { task1, task2, task3 });
Test("Successful+Failed+Failed", new[] { task1, task4, task5 });
Test("Successful+Canceled+Failed+Failed", new[] { task1, task2, task4, task5 });
Test("Successful+Canceled+Canceled+Failed", new[] { task1, task2, task3, task4 });

static void Test(string title, Task<int>[] tasks)
{
    Console.WriteLine();
    Console.WriteLine(title);
    try { Task.WaitAll(tasks); }
    catch (AggregateException ex)
    {
        Console.WriteLine($"WaitAll():      {ToString(ex)}");
    }
    try { Task.WhenAll(tasks).Wait(); }
    catch (AggregateException ex)
    {
        Console.WriteLine($"WhenAll.Wait(): {ToString(ex)}");
    }
}

static string ToString(AggregateException aex) {
    return $"({aex.InnerExceptions.Count}) " +
        String.Join(", ", aex.InnerExceptions.Select(ex => ex.GetType().Name));
}

输出:

代码语言:javascript
复制
Successful+Canceled+Canceled
WaitAll():      (2) TaskCanceledException, TaskCanceledException
WhenAll.Wait(): (1) TaskCanceledException

Successful+Failed+Failed
WaitAll():      (2) ApplicationException, OverflowException
WhenAll.Wait(): (2) ApplicationException, OverflowException

Successful+Canceled+Failed+Failed
WaitAll():      (3) TaskCanceledException, ApplicationException, OverflowException
WhenAll.Wait(): (2) ApplicationException, OverflowException

Successful+Canceled+Canceled+Failed
WaitAll():      (3) TaskCanceledException, TaskCanceledException, ApplicationException
WhenAll.Wait(): (1) ApplicationException

Try it on Fiddle

我们所看到的是,Task.WaitAll()方法按原样传播任务的异常,而Task.WhenAll().Wait()方法仅传播单个TaskCanceledException,并且仅当没有其他类型的异常发生时才传播。

还应该提到的是,使用Task.WaitAll可以获得更多开箱即用的选项,比如millisecondsTimeoutcancellationToken,或者两者兼而有之。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69284445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档