我正在处理一个任务并行问题,其中有许多任务可能会抛出异常。
我想处理所有正常完成的任务并记录其余内容。
我想处理所有正常完成的任务并记录其余内容。
Task.WhenAll
将传播任务异常,而不允许我收集剩下的结果。 static readonly Task<string> NormalTask1 = Task.FromResult("Task result 1");
static readonly Task<string> NormalTask2 = Task.FromResult("Task result 2");
static readonly Task<string> ExceptionTk = Task.FromException<string>(new Exception("Bad Task"));
var results = await Task.WhenAll(new []{ NormalTask1,NormalTask2,ExceptionTk});
Task.WhenAll
会忽略其余结果并抛出 ExcceptionTk
异常。如何在忽略异常的情况下获取结果并同时记录异常?
我可以将任务包装到另一个任务中,该任务try{...}catch(){...}
内部异常,但我无法访问它们,希望不必添加此开销。
WaitAll
而不是WhenAll
。无论如何,使用WaitAll
已经有一个昂贵的阻塞操作了。在任何情况下,将响应包装在结果类中是更好的选择。我猜你有一系列的处理任务,如果是这样的话,你还应该看看TPL Dataflow。 - Panagiotis Kanavos