有没有办法实现Parallel.For
这个for
循环的版本?
for (int i = 0; i < 100; i += 2) { DoStuff(i); }
我没有看到接受 step 参数的重载,尽管我想不出任何原因这在逻辑上是不可能的。
对此和这个问题的公认答案建议在使用生成Parallel.ForEach
的一系列int
s 上使用Enumerable.Range
,但在我的情况下,我使用的是线程本地数据,因此。Parallel.ForEach
不是一个选项
另一种选择是只检查i % 2 == 0
我的循环体中是否存在 and 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;
);
}
);