6

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

我的 For 循环:

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

是否可以告诉并行循环我想将 i 增加 2 而不是 1?

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

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

我可以告诉内部循环体忽略 i 的奇数值,但这似乎有点混乱 - 有没有办法在循环初始化中以某种方式做到这一点?

4

4 回答 4

12

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

Parallel.For(0, _DataList.Length / 2, i =>
{
    // do work for _DataList[2 * i]                    
});
于 2010-10-20T16:50:56.640 回答
11

怎么样:

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

Task.Factory.StartNew(() =>
    Parallel.ForEach(odds, i =>
    {
        // do work for _DataList[i]                    
    })
);
于 2010-10-20T16:56:02.117 回答
1

Darin Dimitrov 的回答显示了一种简单的方法来实现这一点。

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

于 2010-10-20T17:03:21.067 回答
0

只需跳过偶数值。

Task.Factory.StartNew(() =>
                Parallel.For(1, _DataList.Length, i =>
                {
                    if(i % 2 == 0)
                    {
                        // do work for   
                    }   
                })
            );
于 2015-09-19T08:14:57.460 回答