2017-11-17 99 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