2016-11-16 66 views

回答

9

基本上,您需要保留一组不完整的任务,并重复使用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

Task.WhenAny'的'连续通话,直到我们实现了第一个有效的真正的任务,这就是我的想法,试图找到一个过载,它可以做到这一点,但有没有,谢谢@Jon为您提供最佳的解决方案。 尽管如此,为什么Hashset,我们可以简单地使用数组,如果重复任务在数组中很好的话会怎么样 –

+0

@MrinalKamboj:您需要能够从您传递的集合中删除已经检查完成的任务'WhenAny' - 否则它会立即返回并再次给你相同的任务。您无法从阵列中移除项目。我建议使用'HashSet',以便可以在O(1)中找到并删除任务,而不是O(n),尽管除非您有很多任务,它与“List > '可能是微不足道的。 –

+0

为什么在Task.WhenAny(activeTasks)后检查completed.Status == TaskStatus.RanToCompletion;?如果将它作为lamba扩展或其他东西,我会很高兴,如果您不打算这么做,我可能会在后面尝试。 – Milleu