【发布时间】:2010-08-15 13:37:36
【问题描述】:
我不确定 Parallel.foreach 的内部线程处理是如何工作的,以及它是否可以保证这样的构造可以工作?
Parallel.Foreach(Connections, c =>
{
Input in = c.getInput();
while (in.hasNext()) {
object o = in.getNext();
dosomething(o);
}
}
);
其中 in.hasNext() 只是等待输入流中的一个对象并返回 true。基本上我可以在一个并行的 foreach 结构中运行一堆无限的 while 循环,同时保证它们都将同时运行。
(对于勇敢的人,我可以调整这个,以便我可以通过添加(和删除,这应该是微不足道的)连接来编辑连接列表,它仍然会从列表中的所有连接中读取输入)。
【问题讨论】:
-
这应该可行,当你尝试它时会发生什么?
-
我可以尝试,但我不能保证它永远不会产生竞争条件。给我 15 分钟的时间来设置一个测试服务器/客户端。
-
我认为设置快速测试服务器/客户端会像在 Java 中一样简单快捷。 C# 没那么好。
-
如果您要修改 Connections 集合,您可能不想使用 Parallel.Foreach,而应该自己创建并跟踪 Task 实例。当您需要对一组(静态)项目进行并行处理时,Parallel.Foreach 助手更适合。
-
@Raynos:确实,您需要从阻塞 I/O 切换到事件驱动。 I/O 调用的 .NET Begin/End 模型在下面使用 I/O 完成端口,这比每个连接一个线程要好得多。
标签: c# multithreading input parallel-processing