Parallel.For使用step!= 1

Rot*_*tem 8 c# parallel-processing for-loop task-parallel-library

有没有办法实现Parallel.For这个for循环的版本?

for (int i = 0; i < 100; i += 2) { DoStuff(i); }
Run Code Online (Sandbox Code Playgroud)

我没有看到接受步骤参数的重载,但我想不出任何理由这在逻辑上是不可能的.

对此问题的接受答案建议使用Parallel.ForEach一系列int使用生成的s Enumerable.Range,但在我的情况下,我使用线程本地数据,因此Parallel.ForEach不是一个选项.

另一个选择是检查i % 2 == 0我的循环体是否return,但是仍然执行线程本地数据初始化器Func和终结器Func.以下是演示此选项的代码段:

Parallel.For<Bar>(0, limit, 

    () => new Bar(), //thread local data initialize

    (i, state, local) => //loop body
    {
        if (i % 2 != 0) return local;
        local.foo += DoStuff(i);
        return local;
    },

    (local) => //thread local data post-action
    {
        lock (loopLocker)
        {
            globalData.foo += local.foo;
        );
    }
);
Run Code Online (Sandbox Code Playgroud)

Ben*_*igt 14

这是一个提示:

for (int j = 0; j < 50; j++) { i = 2*j; DoStuff(); }
Run Code Online (Sandbox Code Playgroud)

通常,看看您是否可以计算出迭代次数以及从迭代次数到变量值的转换.

  • 没有什么比让我觉得愚蠢的荒谬简单的解决方案:)谢谢. (2认同)

Toa*_*yen 5

这是处理阶梯索引的另一种方法

private void ParallelForEachProcessSteppedIndexes()
        {
            Parallel.ForEach(SteppedIterator(0, 100, 2), (index) => DoStuff(index));
        }

private static IEnumerable<int> SteppedIterator(int startIndex, int endIndex, int stepSize)
        {
            for (int i = startIndex; i < endIndex; i = i + stepSize)
            {
                yield return i;
            }
        }
Run Code Online (Sandbox Code Playgroud)