【发布时间】:2016-05-31 10:26:13
【问题描述】:
这是我在 MSDN 网站上找到的一些代码。
long[] nums = { 1, 2, 3, 4 };
long total = 0;
Parallel.For<long>(0, nums.Length, () => 0, (j, loop, subtotal) =>
{
subtotal += nums[j];
return subtotal;
}, (x) => Interlocked.Add(ref total, x));
我想知道是否有人可以告诉我如何修改此代码以将结果写回共享数组?如下所示。
My_Class[] localArray;
Parallel.For<My_Class[]>(0, localArray.Length, () => 0, (j, loop, messages) =>
{
List<My_Class> tempList = new List<My_Class>();
My_Class myClass = localArray[j];
foreach (Message msg in myClass.GetListOfMessages())
{
if (msg.getHeader() == "Hello")
{
tempList.add(msg);
}
}
messages = temp.toArray();
return messages;
}, (x) => Interlocked.Add(ref localArray, x));
所以你看到上面的例子我有一个共享的本地数组,其中包含“My_Class”类型的对象。 My_Class 对象包含一个消息列表,我要搜索这些消息以查找标题为“Hello”的特定类型的消息。
因此,在示例代码中,我使用并行 for 循环遍历我的自定义对象并创建一个名为“tempList”的临时列表,我最终将其转换为数组并作为结果返回。
但是上面的代码只是不适用于数组,特别是 (x) => Interlocked 行,它似乎不兼容将许多数组返回的结果合并到一个数组中。
请有人帮助我。
【问题讨论】:
-
您可以使用 PLINQ (
AsParallel) 使其变得更简单。另外 - 上面的代码不会编译,因为 tempList 包含My_Class对象,而您正在尝试添加Message对象。 -
任何共享数据都是并行处理的问题。但是,在您的情况下,您甚至不需要它。您可以轻松地使用 ConcurrentQueue 代替数组或列表。此外,MSDN 示例解决了与您的情况完全不同的情况。 MSDN 处理大量数据的并行处理、分区和收集结果。您的代码不是那种类型的 - 它正在处理单个消息。根本不需要最终数组或互锁
标签: .net concurrency task-parallel-library