Parallel.ForEach丢失数据

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随每次运行而变化

nvo*_*igt 6

你似乎很难对结果感到困惑,并让它们回到一个连贯的列表中.您可以使用PLinQ,因此您不必担心结果容器是线程安全的:

var processedData = yourData.AsParallel().Select(ProcessData).ToList();
Run Code Online (Sandbox Code Playgroud)


Pet*_*ter 5

您的问题似乎出在:AddRows(localData,processedData,obj)。此方法可能会将数据添加到非线程安全的列表中。您应该将其添加到线程安全列表或围绕添加数据进行一些同步。