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

Geo*_*uer 6 .net error-handling async-await

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

var results = await Task.WhenAll(task1, task2, task3);
return process(results);
Run Code Online (Sandbox Code Playgroud)

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

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

out*_*man 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());
Run Code Online (Sandbox Code Playgroud)