8

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

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

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

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

4

2 回答 2

5

您可以像下面的示例一样处理这种情况:

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());
于 2013-04-07T00:31:46.833 回答
1

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

var tasks = new[] { task1, task2, task3 };
try { await Task.WhenAll(tasks); } catch (...) { }
return process(tasks);
于 2013-04-07T00:53:58.307 回答