Как создать бесконечный цикл задач? - PullRequest
0 голосов
/ 24 января 2019

Я бы хотел создать бесконечный цикл Task .Когда любая задача завершит работу, она будет удалена из списка задач, а новая задача будет добавлена ​​в список.Предложение моего кода:

// create list of 128 task in queue
List<Task> tasks = new List<Task>();
for (int n = 0; n < 128; n++)
{
    tasks.Add(Task.Run(() => JOB(n);
}
// wait for finish and add immediately new running task to the list
while (tasks.Count > 0)
{
    Task firstFinishedTask = Task.WhenAny(tasks);
    tasks.Remove(firstFinishedTask);    // line with problem
    tasks.Add(Task.Run(() => JOB(n);
}

Проблема завершена, задачи не удалены из списка.Они получили разные Task.Id , и это огромный побочный эффект.

1 Ответ

0 голосов
/ 24 января 2019
Task firstFinishedTask = Task.WhenAny(tasks);

Это ужасно неправильно названная переменная. Task.WhenAny возвращает Task<Task>. external Task завершается, когда завершается любая из задач, переданных в WhenAny. inner Task - это задача, которая привела к этому. WhenAny само по себе не выполняет никаких ожиданий.

Обычный *1015* способ использования WhenAny состоит в том, чтобы использовать его с await - который всегда удаляет внешний Task из того, что вы передаете, и возвращает вам внутреннее содержимое.

Если вы не хотите использовать WhenAny с await, вы можете вместо этого искать WaitAny - который блокирует ваш текущий поток [:-(] и возвращает вам индекс вместо Task, но, по крайней мере, позаботится о том, чтобы на самом деле ожидал , пока одна из задач, которую вы передали, была выполнена (но, как сказал ответ, я бы предпочел увидеть await Task.WhenAny(tasks), чтобы освободить вверх по этой теме)

tasks не содержит внешнего Task, созданного WhenAny - поэтому ваша попытка Remove не удалась.

...