Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建无限运行任务循环?_C#_Multithreading_Task - Fatal编程技术网

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下载数据。