2012-12-26 2 views
8

このforループのParallel.Forバージョンを達成する方法はありますか?Parallel.Forステップを使用してください!1

for (int i = 0; i < 100; i += 2) { DoStuff(i); } 

論理的には不可能な理由は考えられませんが、ステップパラメータを受け入れるオーバーロードはありません。そうParallel.ForEachオプションないint sの範囲にParallel.ForEachを使用して

thisthis質問への受け入れ答えは示唆はEnumerable.Rangeを使用して生成されますが、私の場合、私は、スレッドローカルデータに を使用しています。

別のオプションは、ちょうど私のループとreturnの本体でi % 2 == 0かどうかを確認することですが、これはまだ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; 
     ); 
    } 
); 

答えて

14

がヒントです:あなたは、変数の値に反復回数と反復数から変換を把握することができた場合、一般的に

for (int j = 0; j < 50; j++) { i = 2*j; DoStuff(); } 

、参照。

+2

何を変換しなかった後、私のために働いた階段状のインデックスを処理するための別の方法です:) ありがとうございます。 – Rotem

3

ベンの提案は、一定のステップで非常に良いです。 +2、+3など

(手順がランダムの場合)Parallel.ForEachなどを使用できます。

int[] input = { 1, 3, 4, 5, 7, 10, 20, 25 }; 

Parallel.ForEach(input, 
    () => new Bar(), //thread local data initialize 
    (i, state, local) => //loop body 
    { 
     // your code 
    }, 
    (local) => //thread local data post-action 
    { 
     // your code 
    } 

変数iinput配列からデータを取得します。あなたはi変数にのみ素数を取得したいと思いあれば完全に正常に動作することを

Enumerable.Rangeinputを置き換える(または Withなどとそれを組み合わせる)ことができます。ここで

+0

なぜ私は以前に 'Parallel.ForEach'のスレッドローカルオーバーロードを逃したのか分かりませんでしたが、スレッドの局所性は' Parallel.For'でしか利用できないと思っていました。ありがとう – Rotem

3

private void ParallelForEachProcessSteppedIndexes() 
     { 
      Parallel.ForEach(SteppedIterator(0, 100, 2), (index) => DoStuff(index)); 
     } 

private static IEnumerable<int> SteppedIterator(int startIndex, int endIndex, int stepSize) 
     { 
      for (int i = startIndex; i < endIndex; i = i + stepSize) 
      { 
       yield return i; 
      } 
     } 
0

Toanの答えは、VB.NETの新しいイテレータ関数に私は愚かな気分にさせるために途方もなく簡単な解決策のような

Private Sub LoopExample() 
    Parallel.ForEach(SteppedIterator(1,100,5), AddressOf Test) 

End Sub 

Private Iterator Function SteppedIterator(startIndex As Integer, endIndex As Integer, stepSize As Integer) As IEnumerable(Of Integer) 
    For i As Integer = startIndex To endIndex Step stepSize 
     Yield i 
    Next 

End Function 

Private Sub Test(i As Integer, state As ParallelLoopState, index As Long) 
    Debug.WriteLine(i.ToString) 
End Sub 
関連する問題