3

나는 다음과 같이 수행 할 .NET 4.0 프레임 워크 및 비동기 CTP Extensions를 사용으로 제한하고 있습니다 :TaskEx.WhenAll 및 예외

_tasks
 var dataTasks = _tasks.Select(t => t.GetData(keys)); 

    var results = TaskEx.WhenAll(dataTasks).Result.ToList(); 

는 각각 GetData 메서드를 제공하는 개체의 목록입니다 그러면 Task<Data>이 반환됩니다.

내 문제는 dataTasks 중 하나가 예외를 던지고 전체를 주유하고 있다는 것입니다. 각 dataTask의 결과를 검사하고 결과를 확인하고 예외를 기록한 다음 유효한 결과를 계속 표시 할 수 있기를 원합니다. 나는 그것에 대해 지금가는 확실하지 않다. 어떤 도움이라도 대단히 감사하겠습니다.

+0

혹시 남아있는 결과를 얻을 여전히 시도 끄는 WhenAll을하는 방법을 찾아나요 : 당신은 그에 WhenAll().Result (또는 await WhenAll())를 사용하는 경우, 당신은 당신이 필요로 정확히 인 Task<T>[]를 얻을 수 있습니다 ? – tofutim

답변

0

TaskEx.WhenAll(dataTasks)은 귀하의 복합 작업입니다. 그것은 잘못되었을 수도 있습니다.

Result을 호출하면 예외가 발생합니다. 그러지 마라. Exception 또는 IsFaulted 속성을 검사하십시오.

+0

성공적인 'Task's의 결과를 얻는 방법? – svick

+0

'WhenAll'에 전달 된 원래 작업 목록을 추적합니다. 그것이 당신을 돌려 보낼 때 당신은 그 (것)들이 전부 완료했다는 것을 알고 그래서 당신은 그 (것)들을 신뢰성있게 시험 할 수있다. – usr

+0

또한, WhenAll()에 의해 반환 된'Task'가 언제 완료되는지 어떻게 알 수 있습니까? 왜냐하면'Exception' 또는'IsFaulted'는 차단되지 않기 때문입니다. – svick

4

이 작업을 수행하는 한 가지 방법은 간단한 ContinueWith()을 사용하여 잠재적으로 오류가있는 Task<T>Task<Task<T>>으로 변경하는 것입니다.

var dataTasks = _tasks.Select(t => t.GetData(keys).ContinueWith(c => c)); 

Task<T>[] results = Task.WhenAll(dataTasks).Result; 
+1

그건 멋진 트릭이야! – usr

+0

영리한! 고마워. 매력처럼 작동합니다. – John

+0

@ 존, 예외가 발생한 경우에도 "각 dataTask의 결과를 검사하고 결과를 확인하고 예외를 기록"하는 것을 허용합니까? 나는 생각했다. 그러나 체크하지 않았다. 예외가 없어지면'WhenAll()'이있는 행에서'try/catch'를 사용하지 않으면 –