このループ のParallel.For
バージョンを達成する方法はありますか?for
for (int i = 0; i < 100; i += 2) { DoStuff(i); }
これが論理的に不可能な理由は考えられませんが、step パラメーターを受け入れるオーバーロードは見当たりません。
thisおよびthis questionに対する受け入れられた回答は、 を使用して生成された s のParallel.ForEach
範囲で使用することを示唆していますが、私の場合、スレッド ローカル データを使用しているため、オプションではありません。int
Enumerable.Range
Parallel.ForEach
もう 1 つのオプションはi % 2 == 0
、ループの本体内にあるかどうかを確認することとreturn
、これでもスレッド ローカル データの intializerFunc
と finalizerを実行すること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;
);
}
);