.net 4.0 TaskEx.WhenAll和例外情况
我不得不使用.NET 4.0框架和异步CTP扩展来执行以下操作:.net 4.0 TaskEx.WhenAll和例外情况,.net-4.0,exception-handling,task-parallel-library,c#-5.0,async-ctp,.net 4.0,Exception Handling,Task Parallel Library,C# 5.0,Async Ctp,我不得不使用.NET 4.0框架和异步CTP扩展来执行以下操作: var dataTasks = _tasks.Select(t => t.GetData(keys)); var results = TaskEx.WhenAll(dataTasks).Result.ToList(); 其中_tasks是一个对象列表,每个对象都提供一个GetData方法,该方法返回一个任务 我的问题是,dataTasks中的一个正在抛出异常,并将整个异常都存储起来。我希望能够检查每个
var dataTasks = _tasks.Select(t => t.GetData(keys));
var results = TaskEx.WhenAll(dataTasks).Result.ToList();
其中_tasks是一个对象列表,每个对象都提供一个GetData方法,该方法返回一个任务
我的问题是,dataTasks
中的一个正在抛出异常,并将整个异常都存储起来。我希望能够检查每个dataTask的结果并检查结果,记录任何异常,然后继续使用任何有效的结果。不过,我现在不确定该怎么办。任何帮助都将不胜感激 TaskEx.所有(数据任务)
是您的组合任务。这可能是错误的
调用Result
时,这会导致引发异常。所以不要那样做。检查异常
或IsFaulted
属性。执行此操作的一种方法是使用一个简单的ContinueWith()
将可能出现故障的任务
更改为成功的任务。如果随后使用WhenAll().Result
(或wait WhenAll()
),您将获得Task[]
,这正是您需要的:
var dataTasks = _tasks.Select(t => t.GetData(keys).ContinueWith(c => c));
Task<T>[] results = Task.WhenAll(dataTasks).Result;
var-dataTasks=\u tasks.Select(t=>t.GetData(keys.ContinueWith(c=>c));
Task[]results=Task.WhenAll(dataTasks.Result);
但是如何获得成功的任务的结果呢?您可以跟踪所有时传递到的原始任务列表。当它返回时,您知道所有这些任务都已完成,因此您可以可靠地检查它们。另外,您如何确定WhenAll()返回的任务
何时完成?因为Exception
或IsFaulted
不会阻止。如果捕获到Wait
可能引发的异常,您需要重新执行WaitAll
或whalll
,这并不太难。只需为每个任务连接一个continuation,并使用同步计数器跟踪完成了多少个。我希望有更好的支持这个内置的。聪明!谢谢斯维克。工作起来很有魅力。@John,你的意思是这允许“检查每个dataTask的结果并检查结果,记录任何异常”以防出现异常?我想,但没有检查,如果在WhenAll()行中不使用try/catch
,则会丢失异常call@John,您可以以类似的方式使用TaskFactory.continuewhalll
。如果您是没有异步CTP或异步目标包的.NET 4.0,这会很方便。有没有办法尝试捕获异常并仍然获得其余结果?您是否找到过尝试捕获WhenAll并仍然获得其余结果的方法?