有什么方法可以实现此 for
循环的 Parallel.For
版本?
for (int i = 0; i < 100; i += 2) { DoStuff(i); }
我没有看到接受 step 参数的重载,尽管我想不出任何这在逻辑上是不可能的原因。
this 的公认答案和 this问题建议在使用 Enumerable.Range
生成的一系列 int
上使用 Parallel.ForEach
,但在我的例子中,我使用的是线程本地数据 < strike>所以 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;
);
}
);
最佳答案
这里有一个提示:
for (int j = 0; j < 50; j++) { i = 2*j; DoStuff(); }
一般来说,看看你能不能算出迭代次数和从迭代次数到变量值的转换。
关于c# - Parallel.For 使用步骤 != 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14045112/