如何创建无限运行的任务循环?

时间:2019-01-24 06:18:42

标签: c# multithreading task

我想创建无限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 :(得分:4)

.ipAddress

这是一个名字可怕的变量。 header('Content-Type: application/pdf'); echo $FILE; 返回Task firstFinishedTask = Task.WhenAny(tasks); 。当传递给Task.WhenAny的任何任务完成时,外部 Task<Task>完成。 inner Task是导致这种情况发生的任务。 WhenAny本身不会执行任何等待。

使用Task通常方式是将其与WhenAny一起使用-它总是将外在的WhenAny从传递的内容中移出并交给您返回内部内容。

如果您不希望将awaitTask一起使用,则可能正在寻找WhenAny,它会阻塞当前线程[:-(]并让您退回索引而不是await,但至少要确实完成等待您完成传递的其中一项任务的等待(但正如我所说的那样,我更喜欢看到WaitAny以便释放该线程)

Task不包含await Task.WhenAny(tasks)创建的外部tasks,这就是您的Task尝试失败的原因。