N个并发线程同时处理对象集合

时间:2012-08-28 22:31:53

标签: c# .net multithreading .net-3.5

我有一组对象。我需要逐个处理单独的线程中的每个对象。应该修复一些同时发生的线程,比如说4.鉴于我受.NET Framework 3.5版的限制,最好的方法是什么?

编辑:按“按顺序”我的意思是在开始时应该开始处理第一个对象。然后,当它仍然被处理时,第二,第三和第四对象的处理开始。第五个对象将等待这四个对象中的任何一个处理完成。等等。 但是,如果第五个没有,则第六个对象无法处理。 您可能已经注意到一些下载管理器以这种方式工作。

2 个答案:

答案 0 :(得分:0)

我假设一旦项目5的过程开始,即使它没有完成,你的项目6的描述也可以处理。

听起来像ConcurrentQueue<T>的自然工作,但那是4.0。

如果你删除对IProducerConsumerCollection<T>的支持,

LLQueue可以被移植到3.5,因为那是4.0,但其余的应该在2.0以上的任何地方运行。

然后只有4个(或多个)线程,每个线程都会一直调用TryDequeue,直到它返回false,如果它返回true,则处理获得的项目。

答案 1 :(得分:0)

你的问题对我来说有点混乱。我不知道你为什么要分批处理4个?

此过程与4批次并行。 批次中的订单无法保证。

public void ParallelOne()
    {
        int[] nums = Enumerable.Range(0, 8).ToArray();
        Debug.WriteLine(nums.Count().ToString() + " " + nums[nums.Count()-1].ToString());
        long total = 0;


        for (int k = 0; k < 2; k++)
        {
            total = 0;
            // Use type parameter to make subtotal a long, not an int
            Parallel.For<long>(k*4, (k+1)*4, () => 0, (j, loop, subtotal) =>
            {
                subtotal += nums[j];
                Debug.WriteLine(subtotal.ToString() + " " + j.ToString());
                return subtotal;
            },
                (x) => Interlocked.Add(ref total, x)
            );

            Debug.WriteLine("The total is {0}", total);
        }

    }

如果你想要4线程的动态并行,那么只需使用Paralled.ForEach并使用WithDegreeOfParallelism将踏板节流为4。