Parallel.For 使用自定义数据类型:在循环外更新变量
Parallel.For with custom data type: Update variable outside of the loop
我正在尝试根据此 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 类似于另一个问题中提供的响应?
您需要为 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 class 只是为了在 Parallel.For
.
中使用多个变量
public class SomeObject
{
public int Number1 { get; set; }
public int Number2 { get; set; }
}
我正在尝试根据此 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 类似于另一个问题中提供的响应?
您需要为 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 class 只是为了在 Parallel.For
.
public class SomeObject
{
public int Number1 { get; set; }
public int Number2 { get; set; }
}