c# - 在 parallel.foreach 范围之外递增计数值

标签 c# synchronization locking parallel-processing

如何在 parallel.foreach 循环范围之外递增整数值?在并行循环之外同步访问对象的最简单方法是什么?

var count = 0;
Parallel.ForEach(collection, item =>
{
  action(item);
  // increment count??
}

最佳答案

我喜欢打死马! :)

从多个线程递增计数的“最简单”方法是:

Interlocked.Increment(ref count);

但正如其他人指出的那样:如果您在 Parallel.ForEach 中执行此操作,那么您可能做错了什么。

我怀疑出于某种原因你正在使用 ForEach 但你需要一个你正在处理的项目的索引(它永远不会与 Parallel.ForEach).我很接近吗?为什么需要计数?你想施展什么样的 VooDoo 魔法?

更新:

如果您的键是 URI 并且值是 TAnswer,那么您使用 ConcurrentDictionary 似乎是安全的。只要您不尝试使用计数来引用集合中的元素,我就看不出问题。

最后...

如果您需要一个计数器,请使用 Parallel.For 循环...它会为您安全地递增计数器。

关于c# - 在 parallel.foreach 范围之外递增计数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2394447/

相关文章:

go - 《 Go编程语言》中的一个奇怪问题

java - 线程同步不起作用

Android - 同步联系人以编程方式添加到谷歌帐户

安卓锁屏

c# - 使用什么对象类型/实例进行同步

c# - Nuget 包命名空间与原始代码不同

c# - 一次调用即可接收按文档类型分组的搜索结果(NEST,AWS Elasticsearch)

C# Expression Tree调用基类属性get方法

java - 为什么锁定文件时会发生 OverlappingFileLockException?

c# - 使用不同大小的像素着色器采样器创建 WPF 效果