2017-11-17 129 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); 
} 

有沒有一種方法可以將我的非並行循環轉換爲並行。類似於另一個問題中提供的響應?

回答

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 
     ); 

我創建了一個虛擬SomeObject類只使用Parallel.For內的多個變量。

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

這工作就像一個魅力!感謝您向我展示這項工作! – user3587624