.net 4.0 TaskEx.WhenAll和例外情况

.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中的一个正在抛出异常,并将整个异常都存储起来。我希望能够检查每个

我不得不使用.NET 4.0框架和异步CTP扩展来执行以下操作:

     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并仍然获得其余结果的方法?