.Net如何报告在Task.WhenAll()期间抛出的所有异常?

Mic*_*ett 5 .net exception-handling async-await

我有一个表单应用程序,在几个点上做

await Task.WhenAll(list_of_tasks)

我的理解是,在这种情况下,如果list_of_tasks中的一个或多个任务抛出异常,"await"也将仅传播其中一个异常.(您可以检查每个任务,看看它失败的原因)

我的问题是:如果你有一个应用程序范围的异常处理程序,它记录了日志的所有异常,它如何记录list_of_tasks中抛出的每个异常的信息?(假设异常处理程序只会出现一个从await发出的异常,并且该异常不像AggregateException那样告诉你其他异常)

迈克尔

Evk*_*Evk 3

因此,正如您可能已经知道的那样,为了方便起见,await 解开 AggregateException,因为 Task.Exception 属性是 AggregateException 类型,如果它没有解开 - 您在等待某些任务时必须始终捕获AggregateException,然后再费心解开自己。

对于 Task.WhenAll 我认为这种行为确实不是您想要的。所有其他异常都被吞掉(因此被视为已观察到,并且不会到达 UnobservedTaskException 处理程序)。如果在这种情况下记录所有异常对您来说很重要,您可以编写一些扩展方法,如下所示:

static class TaskExtensions {
    static async Task WhenAllAggregate(params Task[] tasks) {
        var all = Task.WhenAll(tasks);
        try {
            await all;
        }
        catch {
            // swallow caugth exception but throw all               
            throw all.Exception;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像往常一样在应用程序范围的处理程序中记录聚合异常。