我有三个任务需要并行运行。我需要等待所有三个任务完成,然后继续处理它们的结果。类似于以下代码:
var results = await Task.WhenAll(task1, task2, task3);
return process(results);
当这三项任务全部成功完成时,这种方法可以正常工作。但是,如果其中一项失败了,我会收到一个异常,这不是我想要的。如果这些任务中的任何一个抛出 InvalidOperationException
异常,我可以继续处理,我只需要让 process
方法可以访问被抛出的异常。
我知道我可以在任务内部使用 try...catch
,但那似乎不是一个好的解决办法。除了语义上不正确(任务确实失败了-它不应该返回成功),如果我采用这种方法,由于结果可以成功或返回异常,我将不得不返回一个自定义类型。然而,Task<T>
对象已经公开了一个异常通道,因此我宁愿不做重复的工作,而是使用已经存在的内容。
var combinedTask = Task.WhenAll(…); await combinedTask.IgnoreExceptions(); return process(combinedTask);
这样的东西吗?其中IgnoreExceptions()
可以使得在不抛出异常的情况下等待一个失败的Task
。或者results
应该包含什么内容? - svickIgnoreExceptions()
是存在的吗?我找不到它。 - George Mauer