我有一个我希望并行执行的独立方法列表,我需要所有这些方法才能成功。
我的问题是,当他们中的任何一个抛出错误时 - WaitAll正在等待其他任务完成。但我想立即回到来电者那里。
在这种情况下取消其他任务以避免浪费资源也是一件好事。我试图从AggregateException catch块调用Cancel on CancellationTokenSource,但由于此时所有任务都已完成(或失败),因此为时已晚。
var tasks = new List<Task>
{
Task.Factory.StartNew(() => FirstTask()),
Task.Factory.StartNew(() => SecondTask()),
...
};
try
{
Task.WaitAll(tasks.ToArray());
}
catch (AggregateException aEx)
{
return null;
}
答案 0 :(得分:1)
如果您传递CancellationToken
并对其进行监控,则可以拨打Task.WhenAny
而不是Task.WaitAll
,这将在任务完成后返回。然后,您可以在完成后逐个监控它们:
try
{
while (tasks.Count() > 0)
{
var task = await Task.WhenAny(tasks);
if (task.IsCanceled || task.IsFaulted)
{
cancellationTokenSource.Cancel();
// Do something with the exception message by accessing
// task.Exception.
}
tasks.Remove(task);
}
}