【发布时间】:2016-07-05 06:30:13
【问题描述】:
Parallel.ForEach 有助于提高性能,但是,我看到数据丢失。
已尝试 - 变量结果,已处理数据为 ConcurrentBag<IwrRows>
1)
Parallel.ForEach(results, () => new ConcurrentBag<IwrRows>(), (n, loopState, localData) =>
{
return ProcessData(n); // ProcessData complicated business logic
}, (localData) => AddRows(localData, processedData, obj)
);
2)
await Task.Run(() => Parallel.ForEach(results, item =>
{
ProcessData(item, processedData);
}));
3)
Parallel.ForEach(results, item =>
{
ProcessData(item, processedData);
});
他们都丢失了一些行。
当我使用 foreach 块时,它始终返回相同的值,但是速度慢了 4 倍。
foreach (var item in results)
{
// ProcessData returns a List<IwrRows>
processedData.AddRange(ProcessData(item));
}
不确定我在这里缺少什么。
结果 - 51112 Foreach 返回 41316 行。 ForeachParallel 返回 41308 或 41313 或 41314 因每次运行而异
【问题讨论】:
-
ProcessData()的定义是什么? -
我同意 makro88 回答中的一点:您至少应该解释 ProcessData() 函数的通常预期返回值是什么,以便其他人可以更好地帮助您。正如你现在写的那样,这个函数似乎返回了一个处理过的数据的集合,其中包含 0-N 个项目。您能否编辑问题并澄清这一点?项目数量的预期数学不清楚,其他人无法重现。如前所述,尝试在MCVE 中隔离您的问题,否则应标记并关闭此问题。
标签: c# parallel.foreach