Parallel.For with custom data type:在循环外部更新变量

时间:2017-11-17 23:41:51

标签: c# .net parallel-processing .net-4.0

我正在尝试根据此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类似于另一个问题中提供的响应?

1 个答案:

答案 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; }
}