有没有办法实现这个 for
循环的 Parallel.For
版本?
for (int i = 0; i < 100; i += 2) { DoStuff(i); }
我没有看到接受步长参数的重载版本,但我想不出任何逻辑上不可能的原因。
在这个和这个问题的被接受答案中建议使用
Enumerable.Range
生成的int
范围上的Parallel.ForEach
,但在我的情况下,我正在使用线程本地数据,所以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;
);
}
);