Если у меня есть список задач, которые я хочу выполнить вместе, но в то же время я хочу выполнить определенное количество из них вместе, поэтому я жду одну из них, пока одна из них не завершится, что тогда должно означать ожиданиедолжен остановиться, и новая задача должна быть разрешена для запуска, но когда одна из них завершается, я не знаю, как перестать ожидать задачу, ожидаемую в данный момент, я не хочу отменить задачу, просто перестану ждатьи пусть он продолжает работать в фоновом режиме.
У меня есть следующий код
foreach (var link in SharedVars.DownloadQueue)
{
if (currentRunningCount != batch)
{
var task = DownloadFile(extraPathPerLink, link, totalLen);
_ = task.ContinueWith(_ =>
{
downloadQueueLinksTasks.Remove(task);
currentRunningCount--;
// TODO SHOULD CHANGE WHAT IS AWAITED
});
currentRunningCount++;
downloadQueueLinksTasks.Add(task);
}
if (currentRunningCount == batch)
{
// TODO SHOULD NOT AWAIT 0
await downloadQueueLinksTasks[0];
}
}
Я нашел около Task.WhenAny
, но из этого комментария здесь я понял, чтодругие задачи будут игнорироваться, поэтому это не то решение, которого я хочу достичь.
Извините, если вопрос глупый или неправильный, но я не могу найти какую-либо информацию о том, как его решить, иликак называется операция, которую я хочу выполнить, чтобы я мог даже правильно искать.
Решение Редактировать
Все предоставленные ответы верны , я принял тот, который решил использовать, но все они верны.
Спасибо всем, я многому научился у всех вас из этих разных ответов и разных способов решения проблемы и какподумать об этом.
Что я узнал об этой конкретной проблеме, так это то, что мне все еще нужно было дождаться других оставшихся задач, поэтому решение состояло в том, чтобы Task.WhenAny
был внутри цикла (который возвращает законченную задачу(это также важно)) И Task.WhenAll
вне цикла для ожидания других левых задач.