2016-11-16 4 views

답변

9

기본적으로 불완전한 작업 세트를 유지하고 결과가 Task.WhenAny을 반복적으로 사용하고 결과가 사용자가 원하는 결과가 아닌 경우 계속 진행 (해당 작업을 제거한 상태)해야합니다. 예를 들어 우리가 첫 번째 유효한 진정한 작업을 달성 할 때까지 Task.WhenAny``의

ISet<Task<bool>> activeTasks = new HashSet<Task<bool>>(myTasks); 
while (activeTasks.Count > 0) 
{ 
    Task<bool> completed = await Task.WhenAny(activeTasks); 
    if (completed.Status == TaskStatus.RanToCompletion && 
     completed.Result) 
    { 
     // Or take whatever action you want 
     return; 
    } 
    // Task was faulted, cancelled, or had a result of false. 
    // Go round again. 
    activeTasks.Remove(completed); 
} 
// No successful tasks - do whatever you need to here. 
+0

연속 호출, 그게 내가, 그것을 할 수 과부하를 찾을려고 생각하고 있었는지, 그러나 아무도, 감사가있다 @Jon은 훌륭한 솔루션입니다. 그럼에도 불구하고 왜 Hashset은 단순히 배열로 작업 할 수 있습니까? 배열에서 중복 된 작업이 좋은 경우는 무엇입니까? –

+0

@MrinalKamboj : 전달한 컬렉션에서 이미 확인한 완료된 작업을 제거 할 수 있어야합니다 'WhenAny' - 그렇지 않으면 즉시 반환되어 동일한 작업을 다시 시도합니다. 배열에서 항목을 제거 할 수 없습니다. 당신이 * 많은 * 작업을하지 않는다면, O (1)보다는 O (1)에서 작업을 찾아서 제거 할 수 있도록'HashSet'을 사용할 것을 제안했습니다. 그 작업과'List > '아마 중요하지 않다. –

+0

왜 완료를 확인합니까? 상태 == TaskStatus.RanToCompletion 다음 Task.WhenAny (activeTasks);? lamba 확장 또는 무엇인가로 그것을 가지고 있으면 좋을 것이다, 나는 당신이하는 것을 괴롭히지 않으면 나중에 그것을 시도 할지도 모른다. – Milleu

관련 문제