我有3个应该并行运行的任务。我需要等待所有3,然后继续处理他们的结果。如下所示:
var results = await Task.WhenAll(task1, task2, task3);
return process(results);
当所有3个任务成功完成时,此工作正常。但是,如果其中一个失败,我会得到一个一直冒泡的异常。这不是我想要的。如果这些任务中的任何一个抛出InvalidOperationException
我可以继续处理,我只需要process
方法就可以访问抛出的异常。
我意识到我可以try...catch
在任务中,但这似乎不是一个黑客。除了在语义上不正确(任务DID失败 - 它不应该成功返回),如果我采用这种方法,因为结果可以成功或返回异常,我将不得不返回自定义类型。然而Task<T>
对象已经暴露了一个异常通道,所以我宁愿不做双重任务而只使用已经存在的东西。
答案 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);