将并行循环与线程逻辑相结合

时间:2017-06-07 17:55:32

标签: c# asp.net asp.net-mvc multithreading parallel-processing

我写了一个代码如下:

var allParams = new List<string>(); // supposingly has 10 items inside it
var secondCollection = new List<string>(); // collection of 100
Parallel.For(0, secondCollection.Count(), new ParallelOptions { 
MaxDegreeOfParallelism = 10 }, counter => 
{
    callingSomeMethod(params[counter]);
});

我试图找出最好的方法,如何将我的params集合与并行for循环结合起来,使得像下面这样的东西:

  • 当10个线程同时启动时,我想传递callingSomeMethod方法中的所有10个元素,当其中一个线程结束时,我只想简单地再次开始传递元素在位置0,1,2,3,4,5,6,7,8,9,0,1,2,3 ......

所以循环会重复,直到Parallel.For循环结束它的周期......

Paralllel循环可行吗?我不确定如何实现这一点,有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

所以你有一个&#34;锯齿状数组,&#34;两个不同长度的列表需要压缩在一起进行处理,两个列表中较短的一个根据需要重复。那个呢?

这样的事情怎么样?

var allParams = new List<string>(); // supposingly has 10 items inside it
var secondCollection = new List<string>(); // collection of 100
var queue = new ConcurrentQueue<string>(secondCollection); //Copy of 100

while (queue.Count > 0)
{
    Parallel.ForEach(allParams, new ParallelOptions { MaxDegreeOfParallelism = 10 }, 
    (param) =>
    {
        string item;
        bool ok = queue.TryDequeue(out item);
        if (ok)
        {
            callingSomeMethod(param, item);
        }
    });
}

这个想法是你将较长列表中的项目放在ConcurrentQueue中,然后重复遍历较短列表,直到队列为空。每次迭代都从foreach循环中的迭代器和队列中获取一个项目,并且可以将这两个项目一起处理。