C#是一个并行foreach而while循环可能吗?

时间:2010-08-15 13:37:37

标签: c# multithreading input parallel-processing

我不确定Parallel.foreach的内部线程处理是如何工作的,以及它是否可以保证这样的结构能够正常工作?

Parallel.Foreach(Connections, c =>
    {
        Input in = c.getInput();
        while (in.hasNext()) {
            object o = in.getNext();
            dosomething(o);
        }
    }
);

其中in.hasNext()只是等待输入流中的对象并返回true。基本上我可以在平行的foreach结构中运行一堆无限的while循环,同时保证它们将同时运行。

(对于勇敢者,我可以调整这个,这样我就可以通过添加(并删除,这应该是微不足道的)连接来编辑连接列表,它仍然会从列表中的所有连接读取输入。)

3 个答案:

答案 0 :(得分:0)

  

基本上我可以在并行foreach结构中运行一堆无限while循环,同时保证它们将同时运行

没有。只有有限数量的工作线程会同时启动,所以如果你运行的无限循环比线程更多,那么最后的线程永远不会运行......

答案 1 :(得分:0)

  1. 使用它的线程数量有限,因此会逐个处理一些元素。

  2. 枚举时编辑列表并不好。您可能会遇到异常(取决于您正在使用的列表

  3. 为什么不为每个连接启动一个新线程?

  4. 示例代码:

    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