在我的 web api 控制器中,我正在使用 Parallel.ForEach() 遍历一个列表。我有一个在 Parallel.ForEach 代码中递增的计数器。我注意到每次运行 counter 时它都是一个可变数字,它永远不会像我用 Parallel.ForEach() 循环的列表那么高。似乎 Parallel.ForEach() 在完成所有元素的循环之前不会等待返回。
// get all the new records from the csv
var newData = csv.GetRecords<MyEFTable>().ToArray();
int count = 0;
Parallel.ForEach(newData, (d) => {
count++});
newData 有 6588 个项目,计数通常约为 3400 个左右,但每次都是可变的。这很奇怪。
你正在进入竞争状态。您需要使用var newCount = Interlocked.Increment(ref count);
来安全地在多线程环境中递增变量。的newCount
变量是递增的计数器。
发生这种情况的原因是因为count++
不是原子的。它实际上是三个操作:获取值,加 1,然后将其存储回来。如果这三件事同时发生,事情就会变得混乱和不稳定。
在处理线程时,确保每个线程不会操作相同的数据至关重要,否则它们会相互挤压。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句