我不确定Parallel.foreach的内部线程处理是如何工作的,以及它是否可以保证这样的结构能够正常工作?
Parallel.Foreach(Connections, c =>
{
Input in = c.getInput();
while (in.hasNext()) {
object o = in.getNext();
dosomething(o);
}
}
);
其中in.hasNext()只是等待输入流中的对象并返回true。基本上我可以在平行的foreach结构中运行一堆无限的while循环,同时保证它们将同时运行。
(对于勇敢者,我可以调整这个,这样我就可以通过添加(并删除,这应该是微不足道的)连接来编辑连接列表,它仍然会从列表中的所有连接读取输入。)
答案 0 :(得分:0)
基本上我可以在并行foreach结构中运行一堆无限while循环,同时保证它们将同时运行
没有。只有有限数量的工作线程会同时启动,所以如果你运行的无限循环比线程更多,那么最后的线程永远不会运行......
答案 1 :(得分:0)
使用它的线程数量有限,因此会逐个处理一些元素。
枚举时编辑列表并不好。您可能会遇到异常(取决于您正在使用的列表
为什么不为每个连接启动一个新线程?
示例代码:
public ConnectionOpen(data)
{
Connection conn=new ...
lock(Connections)
{
Connections.Add(conn);
}
new Thread(()=>
{
Receive(conn);//infinite loop goes here
}).Start();
}
public ConnectionClose(conn)
{
bool removed=false;
lock(Connections)
{
removed=Connections.Remove(conn);
}
if(removed) conn.StopReceiving();
}
答案 2 :(得分:0)
从技术上讲,这段代码可行,但“同时”运行的精确线程数会有所不同。
除了并行扩展之外,.NET 4还为线程池添加了“爬山”和线程注入,因此.NET线程池基本上会尝试向Parallel.ForEach循环添加线程以查看是否有更多线程完成,因为你的永远不会完成线程的数量会有所不同,但我猜测将是不理想的。
您可以尝试使用ParallelWhile构造,该团队已经在博客中介绍了几种方法,here is one。