我有一个对象集合。我需要按顺序在单独的线程中处理这些对象中的每一个。应该修复多个同时线程,例如 4。鉴于我受 .NET Framework 3.5 版的限制,最好的方法是什么?
编辑:“按顺序”我的意思是在开始处理第一个对象时应该开始。然后,当它仍在处理时,开始处理第二个、第三个和第四个对象。第五个对象将等待这四个对象中的任何一个处理完成。等等。但是,比如说,如果第五个没有处理,就无法处理第六个对象。您可能已经注意到一些下载管理器以这种方式工作。
我有一个对象集合。我需要按顺序在单独的线程中处理这些对象中的每一个。应该修复多个同时线程,例如 4。鉴于我受 .NET Framework 3.5 版的限制,最好的方法是什么?
编辑:“按顺序”我的意思是在开始处理第一个对象时应该开始。然后,当它仍在处理时,开始处理第二个、第三个和第四个对象。第五个对象将等待这四个对象中的任何一个处理完成。等等。但是,比如说,如果第五个没有处理,就无法处理第六个对象。您可能已经注意到一些下载管理器以这种方式工作。
我假设在您的描述中,一旦第 5 项的流程开始,即使尚未完成,也可以处理第 6 项。
对于 a 来说,这听起来像是一项自然的工作ConcurrentQueue<T>
,但那是 4.0。
如果你取消对 的支持, LLQueue可以移植到 3.5 IProducerConsumerCollection<T>
,因为那是 4.0,但其余的应该在 2.0 以上的任何东西上运行。
然后只有 4 个(或多个)线程,每个线程都一直调用TryDequeue
,直到它返回 false,如果它返回 true,则处理获得的项目。
你的问题让我有点困惑。不知道你为什么要分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。