如何在任务抛出异常时立即返回?

时间:2015-03-09 14:34:13

标签: c# .net task-parallel-library

我有一个我希望并行执行的独立方法列表,我需要所有这些方法才能成功。

我的问题是,当他们中的任何一个抛出错误时 - 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;
}

1 个答案:

答案 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);
    }
}