如何在一批任务中处理部分成功?

时间:2013-04-07 00:00:05

标签: .net error-handling async-await

我有3个应该并行运行的任务。我需要等待所有3,然后继续处理他们的结果。如下所示:

var results = await Task.WhenAll(task1, task2, task3);
return process(results);

当所有3个任务成功完成时,此工作正常。但是,如果其中一个失败,我会得到一个一直冒泡的异常。这不是我想要的。如果这些任务中的任何一个抛出InvalidOperationException我可以继续处理,我只需要process方法就可以访问抛出的异常。

我意识到我可以try...catch在任务中,但这似乎不是一个黑客。除了在语义上不正确(任务DID失败 - 它不应该成功返回),如果我采用这种方法,因为结果可以成功或返回异常,我将不得不返回自定义类型。然而Task<T>对象已经暴露了一个异常通道,所以我宁愿不做双重任务而只使用已经存在的东西。

2 个答案:

答案 0 :(得分:2)

您可以像下面的示例中那样处理此案例:

Task<T>[] tasks  = new Task<T>[] { task1, task2, task3 };

try
{
   await Task.WhenAll(tasks);
}
catch(InvalidOperationException exception) // If you need to handle any other exception do it
{
   // handle it if you wan to 
}

// You can use task1.IsFauled to know if current task failed, 
// and you can use task1.Exception to know why it failed

return process(tasks.Where(t => !t.IsFauled).ToArray());

答案 1 :(得分:1)

如果我理解正确,你正在寻找这个吗?

var tasks = new[] { task1, task2, task3 };
try { await Task.WhenAll(tasks); } catch (...) { }
return process(tasks);