Parallel.For自定义数据类型:更新循环以外的变量
问题描述:
我想根据此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);
}
有没有一种方法可以将我的非并行循环转换为并行。类似于另一个问题中提供的响应?
答
您需要为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; }
}
这工作就像一个魅力!感谢您向我展示这项工作! – user3587624