我有一组对象。我需要逐个处理单独的线程中的每个对象。应该修复一些同时发生的线程,比如说4.鉴于我受.NET Framework 3.5版的限制,最好的方法是什么?
编辑:按“按顺序”我的意思是在开始时应该开始处理第一个对象。然后,当它仍然被处理时,第二,第三和第四对象的处理开始。第五个对象将等待这四个对象中的任何一个处理完成。等等。 但是,如果第五个没有,则第六个对象无法处理。 您可能已经注意到一些下载管理器以这种方式工作。
答案 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。