从任务引发聚合异常不会中断所有其他任务
本文关键字:任务 中断 其他 异常 | 更新日期: 2023-09-27 18:35:19
我有两个任务:
try
{
List<Task> tasks = new List<Task>();
Task task1 = Task.Factory.StartNew(() => func(param));
tasks.Add(task1);
if (someCondition)
{
Task task2 = Task.Factory.StartNew(() => func2(param2));
tasks.Add(task2);
}
tasksArr = tasks.ToArray();
Task.WaitAll(tasksArr);
}
catch (AggregateException e)
{
//handle
}
catch (Exception)
{
//handle
}
如果其中一个任务中发生异常,我将抛出一个新的聚合异常,但只有在第二个任务完成后才能到达 catch 语句。我想立即抓住它,以便在第二个任务中停止不必要的工作。
我尝试使用取消令牌:
CancellationTokenSource cts = new CancellationTokenSource();
Task.WaitAll(tasksArr,cts.Token);
但这不是一个很好的解决方案,因为它要求处理内部异常 + 捕获的异常将是一个OperationCanceledException
有什么想法吗?
要取消等待,需要将CancellationTokenSource
类的实例传递给 Task.WaitAll 方法(Task[],CancelToken)。此外,在任务失败时运行的每个任务上使用延续(错误,即 TaskStatus.Faulted
)。
var cancellationTokenSource = new CancellationTokenSource();
var tasks = new List<Task>();
var firstTask = new Task(FirstMethod);
firstTask.ContinueWith(t =>
{
Console.WriteLine("First task exception: {0}", t.Exception);
cancellationTokenSource.Cancel();
}, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, TaskScheduler.Default);
tasks.Add(firstTask);
firstTask.Start();
var secondTask = new Task(SecondMethod);
secondTask.ContinueWith(t =>
{
Console.WriteLine("Second task exception: {0}", t.Exception);
cancellationTokenSource.Cancel();
}, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, TaskScheduler.Default);
tasks.Add(secondTask);
secondTask.Start();
try
{
var cancellationToken = cancellationTokenSource.Token;
var tasksArray = tasks.ToArray();
Task.WaitAll(tasksArray, cancellationToken);
}
catch (Exception e)
{
// ...
}