有没有什么办法可以实现for
这个循环的Parallel.For
版本?Parallel.For使用步骤= 1
for (int i = 0; i < 100; i += 2) { DoStuff(i); }
我没有看到一个接受step参数的重载,尽管我想不出任何理由,这在逻辑上是不可能的。使用Enumerable.Range
接受的答案this和this问题建议在一系列int
S使用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;
);
}
);
一点也不像一个可笑的简单的解决方案后,工作了我,使我感到自己很笨:) 谢谢。 – Rotem