我想创建无限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,这是巨大的副作用。
答案 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
从传递的内容中移出并交给您返回内部内容。
如果您不希望将await
与Task
一起使用,则可能正在寻找WhenAny
,它会阻塞当前线程[:-(]并让您退回索引而不是await
,但至少要确实完成等待您完成传递的其中一项任务的等待(但正如我所说的那样,我更喜欢看到WaitAny
以便释放该线程)
Task
不包含await Task.WhenAny(tasks)
创建的外部tasks
,这就是您的Task
尝试失败的原因。