2
나는 Task<bool>[] myTasks
을가집니다. 첫 번째 Task
이 true
을 반환 할 때 어떻게 알림을 받으나요?배열의 첫 번째 작업이 조건과 일치하도록 대기
나는 Task<bool>[] myTasks
을가집니다. 첫 번째 Task
이 true
을 반환 할 때 어떻게 알림을 받으나요?배열의 첫 번째 작업이 조건과 일치하도록 대기
기본적으로 불완전한 작업 세트를 유지하고 결과가 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.
연속 호출, 그게 내가, 그것을 할 수 과부하를 찾을려고 생각하고 있었는지, 그러나 아무도, 감사가있다 @Jon은 훌륭한 솔루션입니다. 그럼에도 불구하고 왜 Hashset은 단순히 배열로 작업 할 수 있습니까? 배열에서 중복 된 작업이 좋은 경우는 무엇입니까? –
@MrinalKamboj : 전달한 컬렉션에서 이미 확인한 완료된 작업을 제거 할 수 있어야합니다 'WhenAny' - 그렇지 않으면 즉시 반환되어 동일한 작업을 다시 시도합니다. 배열에서 항목을 제거 할 수 없습니다. 당신이 * 많은 * 작업을하지 않는다면, O (1)보다는 O (1)에서 작업을 찾아서 제거 할 수 있도록'HashSet'을 사용할 것을 제안했습니다. 그 작업과'List> '아마 중요하지 않다. –
왜 완료를 확인합니까? 상태 == TaskStatus.RanToCompletion 다음 Task.WhenAny (activeTasks);? lamba 확장 또는 무엇인가로 그것을 가지고 있으면 좋을 것이다, 나는 당신이하는 것을 괴롭히지 않으면 나중에 그것을 시도 할지도 모른다. – Milleu