【发布时间】:2014-08-16 01:41:48
【问题描述】:
我有需要在 while 循环中运行 Parallel.Foreach 的场景。我需要了解此实现对处理方式的影响。我会有一个类似这样的实现
ConcurrentQueue<MyTable> queue = new ConcurrentQueue<MyTable>();
在这里,我最初在队列中添加了很多项目,但在执行过程中,还可以在队列中添加更多项目。
while(true)
{
Parallel.Foreach(queue, (myTable) => {some processing});
Sleep(sometime);
}
每次一个项目将被取消排队并产生新的线程来处理它,同时将添加新项目,因为我需要保持一个无限的while循环。
现在,我需要了解,由于并发队列是线程安全的,我认为每个项目只会被处理一次,尽管在 foreach 之上,但我不确定是否会有 foreach 本身的多个线程将产生子线程或 foreach 的单个副本将在 while 循环中运行。我不知道 foreach 本身是如何实现的。
【问题讨论】:
-
我不太确定你在问什么,但
Parallel.Foreach()会等到它的任务完成后再继续,就像它是任何简单的陈述一样。 -
有什么问题?
-
如果您知道何时添加新项目,则不需要无限循环来轮询新项目。
-
如何从队列中删除已处理的项目?
-
@kingjah 我需要无限循环,因为如果没有添加任何项目并且所有正在运行的任务都已完成,则 parallel.foreach 将退出。
标签: c# foreach task-parallel-library parallel.foreach