2016-11-16 37 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