Task.WaitAll,如何查找导致AggregateException的任务

问题描述 投票:5回答:4

假设我得到了以下代码:

var tasks = BuildTaskList();
try
{
    Task.WaitAll(tasks.ToArray());
}
catch (AggregateException exception)
{

}

我如何知道哪个任务引发了exception.InnerExceptions中的哪些异常?

c# task-parallel-library
4个回答
7
投票

您仍然具有Tasks的列表,并且每个Task都有Exception属性。使用它可以找出哪些异常属于哪个Task

但是,如果可以的话,使用Task.WhenAllTaskFactory.ContinueWhenAll胜于阻止Wait。


2
投票
var throwers = tasks.Where(task => task.Exception != null);

0
投票
        var t1 = Task.Factory.StartNew(() => Console.WriteLine("Task 1"));
        var t2 = Task.Factory.StartNew(() => Console.WriteLine("Task 2"));
        var t3 = Task.Factory.StartNew(() => { throw new InvalidOperationException(); });
        var t4 = Task.Factory.StartNew(() => Console.WriteLine("Task 4"));

        Task.Factory.ContinueWhenAll(new[] { t1, t2, t3, t4 }, tasks =>
            {
                foreach (var t in tasks)
                {
                    if (t.Status == TaskStatus.Faulted)
                    {
                        // this will run for t3
                        Console.WriteLine("This task has been faulted.");
                    }
                }
            });

0
投票

您可以根据任务名称定义抛出的异常的Source属性,并在迭代时查看它:

var t1 = Task.Factory.StartNew(() => 
{
    throw new Excpetion() { Source = "t1" };
});
var t2 = Task.Factory.StartNew(() => 
{
    throw new Excpetion() { Source = "t2" };
});

try
{
    Task.WaitAll(t1, t2);
}
catch (AggregateException ae)
{
    foreach (var exception in ae.InnerExcpetions)
    {
        Console.WrtieLine($"Exception was thrown by {exception.Source}");
    }
}

将输出:

t1引发了异常

t2引发了异常

© www.soinside.com 2019 - 2024. All rights reserved.