2
我有一個。當第一個Task
返回true
時,我該如何得到通知(等待)?等待陣列中的第一個任務以匹配條件
我有一個。當第一個Task
返回true
時,我該如何得到通知(等待)?等待陣列中的第一個任務以匹配條件
基本上,您需要保留一組不完整的任務,並重復使用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.
Task.WhenAny'的'連續通話,直到我們實現了第一個有效的真正的任務,這就是我的想法,試圖找到一個過載,它可以做到這一點,但有沒有,謝謝@Jon爲您提供最佳的解決方案。 儘管如此,爲什麼Hashset,我們可以簡單地使用數組,如果重複任務在數組中很好的話會怎麼樣 –
@MrinalKamboj:您需要能夠從您傳遞的集合中刪除已經檢查完成的任務'WhenAny' - 否則它會立即返回並再次給你相同的任務。您無法從陣列中移除項目。我建議使用'HashSet',以便可以在O(1)中找到並刪除任務,而不是O(n),儘管除非您有很多任務,它與「List> '可能是微不足道的。 –
爲什麼在Task.WhenAny(activeTasks)後檢查completed.Status == TaskStatus.RanToCompletion;?如果將它作爲lamba擴展或其他東西,我會很高興,如果您不打算這麼做,我可能會在後面嘗試。 – Milleu