Kar*_*ddu 11 c# parallel.foreach
Parallel.ForEach有助于提高性能,但我看到数据丢失.
尝试 - 变量结果,processedData是 ConcurrentBag<IwrRows>
1)
Parallel.ForEach(results, () => new ConcurrentBag<IwrRows>(), (n, loopState, localData) =>
{
return ProcessData(n); // ProcessData complicated business logic
}, (localData) => AddRows(localData, processedData, obj)
);
Run Code Online (Sandbox Code Playgroud)
2)
await Task.Run(() => Parallel.ForEach(results, item =>
{
ProcessData(item, processedData);
}));
Run Code Online (Sandbox Code Playgroud)
3)
Parallel.ForEach(results, item =>
{
ProcessData(item, processedData);
});
Run Code Online (Sandbox Code Playgroud)
所有人都失去了一些行.
当我使用foreach块时,它始终返回相同的值,但是它慢了4倍.
foreach (var item in results)
{
// ProcessData returns a List<IwrRows>
processedData.AddRange(ProcessData(item));
}
Run Code Online (Sandbox Code Playgroud)
不知道我在这里缺少什么.
结果 - 51112 Foreach返回41316行.ForeachParallel返回41308或41313或41314随每次运行而变化
你似乎很难对结果感到困惑,并让它们回到一个连贯的列表中.您可以使用PLinQ,因此您不必担心结果容器是线程安全的:
var processedData = yourData.AsParallel().Select(ProcessData).ToList();
Run Code Online (Sandbox Code Playgroud)
您的问题似乎出在:AddRows(localData,processedData,obj)。此方法可能会将数据添加到非线程安全的列表中。您应该将其添加到线程安全列表或围绕添加数据进行一些同步。
| 归档时间: |
|
| 查看次数: |
1578 次 |
| 最近记录: |