我正在尝试根据此question中提供的答案编写一些代码。 问题是,在我的情况下,我有自己的自定义数据类型,我没有使用整数。
如何使用自定义数据执行Parallel.For?
这是链接问题
中提供的答案Parallel.For<int>(0, 1000, () => 0, (res, loop, subtotal) =>
{
subtotal += 1;
return subtotal;
},
(x) => Interlocked.Add(ref sum, x)
);
这就是我在不使用Parallel的情况下进行循环的方法。
int value1 = 0;
int value2 = 0;
List<MyData> myDataTypeList = ...
foreach (var myDataType in myDataTypeList)
{
value1 = value1 + Function1(myDataType);
value2 = value2 + Function2(myDataType);
}
有没有办法可以将非并行循环转换为Parallel.For类似于另一个问题中提供的响应?
答案 0 :(得分: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; }
}