C# 如何创建无限运行任务循环?
我想创建无限循环。当任何任务完成作业时,它将从任务列表中删除,并将新任务添加到列表中。我的代码的建议:C# 如何创建无限运行任务循环?,c#,multithreading,task,C#,Multithreading,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 immediate
// 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);
}
//创建队列中128个任务的列表
列表任务=新列表();
对于(int n=0;n<128;n++)
{
tasks.Add(Task.Run)(()=>JOB(n);
}
//等待完成并立即将新的正在运行的任务添加到列表中
而(tasks.Count>0)
{
Task firstFinishedTask=Task.WhenAny(任务);
任务。删除(firstFinishedTask);//有问题的行
tasks.Add(Task.Run)(()=>JOB(n);
}
问题是任务没有从列表中删除。它们得到了不同的结果,这是巨大的副作用
Task firstFinishedTask = Task.WhenAny(tasks);
这是一个非常错误的变量。Task.WhenAny
返回一个任务
。当传递给WhenAny
的任何任务完成时,外部任务
就完成了。内部任务
就是导致这种情况发生的任务。WhenAny
本身不执行任何类型的等待g
在任何时候使用的通常方法是将它与wait
一起使用-它总是从您传递的任务中删除外部任务
,并将内部内容交还给您
如果你不想在任何时候使用和wait
,你可能会寻找WaitAny
,这会阻止你当前的线程[:-(]并将索引交给你,而不是任务
,但至少会注意实际等待你传递给它的任务之一完成(但正如上面提到的答案,我更愿意看到等待任务。当有(任务)
时,以释放此线程)
任务
不包含创建任何任务时所包含的外部任务
——这就是您的删除
尝试失败的原因
这是一个非常错误的变量。Task.WhenAny
返回一个任务
。当传递给WhenAny
的任何任务完成时,外部任务
就完成了。内部任务
就是导致这种情况发生的任务。WhenAny
本身不执行任何类型的等待g
在任何时候使用的通常方法是将它与wait
一起使用-它总是从您传递的任务中删除外部任务
,并将内部内容交还给您
如果你不想在任何时候使用和wait
,你可能会寻找WaitAny
,这会阻止你当前的线程[:-(]并将索引交给你,而不是任务
,但至少会注意实际等待你传递给它的任务之一完成(但正如上面提到的答案,我更愿意看到等待任务。当有(任务)
时,以释放此线程)
tasks
不包含创建时的外部Task
,这就是为什么你的Remove
尝试失败的原因。当然有办法尝试这样做,但是请你解释一下你想要实现什么,我的蜘蛛感觉告诉我有更好的方法,比如,什么是工作,为什么您需要128个,这是IO绑定的工作吗?我会设计它,以便在作业完成时发布事件。然后删除那些作业。-很容易不管您的问题是什么,我肯定创建一个包含128个任务的固定池来解决它是错误的解决方案。@TheGeneral是的,这是IO Boond。下载数据f当然有办法做到这一点,但是请你解释一下你想要实现什么,我的蜘蛛感觉告诉我有更好的方法,例如,什么是作业,为什么你需要128个,这是IO绑定的工作吗?我会设计它,这样当作业完成时会发布一个事件eleted那些
工作。-很容易不管你的问题是什么,我肯定创建一个包含128个任务的固定池来解决它是错误的解决方案。@TheGeneral是的,这是IO boound。从Internet下载数据。