更改C#Parallel.For循环的增量值

时间:2010-10-20 16:45:57

标签: c# parallel-processing task-parallel-library

我想转换一个for循环,它将迭代器的每次递增增加2,使用TPL进入Parallel For循环。数据不依赖于顺序或以任何方式受约束,但我只想处理源数组的每个其他元素中的数据(在下面的代码中是_Datalist),因此需要增加2。

My For Loop:

for (int i = 1; i < _DataList.Length - 1; i += 2)
{
     // Do work for _DataList[i]
}

是否有可能告诉并行循环我要将i递增2而不是1?

这是并行循环,但显然我每次迭代只递增1次:

        Task.Factory.StartNew(() =>
            Parallel.For(1, _DataList.Length, i =>
            {
                // do work for _DataList[i]                    
            })
        );

我可以告诉内部循环体忽略i的奇数值,但这看起来很麻烦 - 有没有办法在循环初始化中做某种方式?

4 个答案:

答案 0 :(得分:10)

您可以将步数减半并将指数加倍:

Parallel.For(0, _DataList.Length / 2, i =>
{
    // do work for _DataList[2 * i]                    
});

答案 1 :(得分:10)

怎么样:

var odds = Enumerable.Range(1, _DataList.Length).Where(i => i % 2 != 0);

Task.Factory.StartNew(() =>
    Parallel.ForEach(odds, i =>
    {
        // do work for _DataList[i]                    
    })
);

答案 2 :(得分:0)

Darin Dimitrov's answer显示了一种简单的方法来实现这一目标。

然而,这并未添加,因为它通常表明循环体不是真正不同的。在大多数情况下,需要使用不同的增量值通常只需要按特定顺序处理或其他需要并行化以创建竞争条件的问题。

答案 3 :(得分:-1)

只需跳过值即可。

Task.Factory.StartNew(() =>
                Parallel.For(1, _DataList.Length, i =>
                {
                    if(i % 2 == 0)
                    {
                        // do work for   
                    }   
                })
            );