0

我有一个对象集合。我需要按顺序在单独的线程中处理这些对象中的每一个。应该修复多个同时线程,例如 4。鉴于我受 .NET Framework 3.5 版的限制,最好的方法是什么?

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

4

2 回答 2

0

我假设在您的描述中,一旦第 5 项的流程开始,即使尚未完成,也可以处理第 6 项。

对于 a 来说,这听起来像是一项自然的工作ConcurrentQueue<T>,但那是 4.0。

如果你取消对 的支持, LLQueue可以移植到 3.5 IProducerConsumerCollection<T>,因为那是 4.0,但其余的应该在 2.0 以上的任何东西上运行。

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

于 2012-08-28T22:53:44.437 回答
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。

于 2012-08-29T00:23:22.327 回答