假设我得到了以下代码:
var tasks = BuildTaskList();
try
{
Task.WaitAll(tasks.ToArray());
}
catch (AggregateException exception)
{
}
我如何知道哪个任务引发了exception.InnerExceptions
中的哪些异常?
您仍然具有Tasks
的列表,并且每个Task
都有Exception
属性。使用它可以找出哪些异常属于哪个Task
。
但是,如果可以的话,使用Task.WhenAll
或TaskFactory.ContinueWhenAll
胜于阻止Wait。
var throwers = tasks.Where(task => task.Exception != null);
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.");
}
}
});
您可以根据任务名称定义抛出的异常的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引发了异常