我有一个集合,它有要处理的元素,最多只有四个元素可以一起处理。在运行时,所有进程一起启动,所有进程都进入等待状态。一次只处理四个元素。
问题是处理元素是随机选择的,因为所有线程都在等待资源释放。表示第一个元素可以是集合中的最后一个元素。
但是,我需要按照元素在集合中的顺序来处理元素。
请告诉我怎样才能做到这一点?
我使用的是第三方物流和C# 4.0
发布于 2012-09-03 14:25:02
对于并行,总是存在一个定义“按顺序”的意思的问题。假设您有一个包含100个项目的集合。“一次处理4个订单”(如您所请求的)可能意味着:
在这种情况下,您可以使用:
新项目po =新代码(){ MaxDegreeOfParallelism =4 };新项目po,( ParallelOptions )ParallelOptions{ // MaxDegreeOfParallelism });
在任务不均衡的情况下,会很快失去原来的顺序,因为一些线程在重任务上可能会落后,但会按顺序分配任务。
0 1 2 3 4任务_____________________________屏障4 5 6 7 4任务_____________________________屏障等。
在这种情况下,您可以使用一个屏障:
Parallel.ForEach(list.AsParallel().AsOrdered(),b=新屏障(4);代码po =新ParallelOptions() { MaxDegreeOfParallelism =4 };ParallelOptions po,(item) => { // ParallelOptions b.SignalAndWait();});
尽管您必须确保任务的数量是4的倍数,否则屏障不会在单个任务的最后iterations.
Parallel.ForEach (即每个线程将作为单个任务的一部分顺序处理4项)。这将按顺序发出4个一组的任务,但如果任务花费的时间太长,可能会再次导致一些线程落后。https://stackoverflow.com/questions/12241983
复制相似问题