2017-11-17 9 views
0

私はこのquestionで提供された答えに基づいていくつかのコードを書こうとしています。 私の場合、自分のカスタムデータ型があり、整数を使用していません。Parallel.Forカスタムデータ型:ループ外の変数を更新

カスタムデータでParallel.Forを実行するにはどうすればよいですか?

これは、リンクされた質問

Parallel.For<int>(0, 1000,() => 0, (res, loop, subtotal) => 
      { 
       subtotal += 1; 
       return subtotal; 
      }, 
      (x) => Interlocked.Add(ref sum, x) 
      ); 

で提供さ答えであり、これは私がパラレルを使用せずに、私のループをやっている方法です。

int value1 = 0; 
int value2 = 0; 
List<MyData> myDataTypeList = ... 
foreach (var myDataType in myDataTypeList) 
{ 
     value1 = value1 + Function1(myDataType); 
     value2 = value2 + Function2(myDataType); 
} 

私は他の質問に提供される応答に類似Parallel.Forに私の非並列ループを変換することができます方法はありますか?

答えて

1

TLocal変数にintの代わりにオブジェクトを使用する必要があります。

 int value1 = 0; 
     int value2 = 0; 

     //Populate data 
     List<MyDataType> list = new List<MyDataType>(); 
     for (int i = 1; i < 5; i++) 
      list.Add(new MyDataType { SomeProp = i }); 

     Parallel.For(
      0, //Start of loop 
      list.Count, //End of loop 
      () => new SomeObject { Number1 = 0, Number2 = 0 }, //Initializer 
      (i, loop, subtotal) => 
      { 
       // 
       subtotal.Number1 += Function1(list[i]); 
       subtotal.Number2 += Function2(list[i]); 
       return subtotal; 
      }, //Logic 
      (x) => 
      { 
       Interlocked.Add(ref value1, x.Number1); 
       Interlocked.Add(ref value2, x.Number2); 
      }//Finally 
     ); 

Parallel.Forの中に複数の変数を使用するためのダミーのSomeObjectクラスを作成しました。

public class SomeObject 
{ 
    public int Number1 { get; set; } 
    public int Number2 { get; set; } 
} 
+0

これは魅力的でした!どのようにこの作品を教えてくれてありがとう! – user3587624

関連する問題