问题标签 [concurrent-collections]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
663 浏览

c# - BlockingCollection 默认访问器

我正在使用 BlockingCollection 并在尝试对其进行序列化时遇到了问题。该错误发生在新的 XmlSerializer行上。错误是:

您必须在 System.Collections.Concurrent.BlockingCollection`1[[BlockingCollTest.MyItem, BlockingCollTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] 上实现默认访问器,因为它继承自 ICollection。

测试程序是:

在尝试了几种解决方案之后,我不知道如何解决这个错误。

问题:解决 BlockingCollection 问题的序列化需要什么?

0 投票
1 回答
189 浏览

c# - 更新并发集合

我正在开发一个多线程应用程序,我从外部提要加载数据并将它们存储在内部集合中。通过再次从外部提要加载所有数据,这些集合每 X 分钟更新一次。从这些集合中没有其他添加/删除,只是阅读。

通常我会在更新期间使用锁定,就像我在任何地方访问集合一样。

问题:

在这种情况下,并发集合会让我的生活更轻松吗?基本上我看到两种方法

  1. 从外部提要加载数据,然后删除不再存在的项目,添加缺少的项目,然后更新更改的项目——我想这是一个很好的解决方案,借助并发收集(不需要锁定,对吗?),但它需要我这边的代码太多了。

  2. 简单地用一个新的集合对象覆盖旧的集合对象(例如_data = new ConcurentBag(newData)。在这里我很确定使用并发集合完全没有优势,对吗?需要锁定机制。

使用并发集合,我可以使用开箱即用的解决方案吗?我不想重新发明轮子。

0 投票
3 回答
11546 浏览

c# - C# - ConcurrentBag 与 List 的性能比较

前言:我之所以问这个只是因为我没有一个环境(足够大的数据集+计算能力)来以可靠的方式对其进行测试。

问题:给定一个Concurrent Bag,加载了数十亿个项目,由单个线程访问/使用,它的性能是否类似于List?换句话说,对 a 的枚举是否比对 a 的枚举Concurrent Bag更多或更少List<T>

0 投票
2 回答
1177 浏览

c# - 作业的多线程队列

我有一个可以由多个线程(ConcurrentQueue<MyJob>)填充的作业队列。我需要异步(不是通过主线程)实现这些作业的连续执行,但同时只能由一个线程执行。我试过这样的事情:

我认为这段代码有一个问题:如果要执行的任务完成(TryDequeue返回false,但任务尚未标记为已完成)并且此时我得到了一份新工作,它将不会被执行。我对吗?如果是这样,如何解决这个问题

0 投票
1 回答
1006 浏览

c# - 为什么 ConcurrentQueue.Enqueue 方法不加值?

我在 WPF MVVM 应用程序中将 ConcurrentQueue 定义为 ViewModel 类字段:

下面是 AGC_DataRecordToSave 定义:

然后在 System.Windows.Threading.DispatcherTimer 滴答处理程序(在同一个类中)中,我执行以下操作:

并且 _agcAbsoluteDataRecordsToSaveBuf 保持为空(计数 == 0)。所以 ConcurrentQueue.Enqueue 方法不会将值添加到集合中。AGC_DataRecordToSave 记录对象已成功创建并填充数据。我在调试器中检查它。为什么不将值添加到集合中?为什么会出现这种情况?请帮助解决这个问题。

0 投票
3 回答
3402 浏览

c# - 如何在 C# 中提高 ConcurrentDictionary.Count 的性能

最近,我需要在使用SortedDictionaryand之间做出选择SortedList,并选择了SortedList.

但是,现在我发现我的 C# 程序在执行 SortedList.Count 时速度变慢了,我使用调用了数千次的函数/方法对其进行了检查。

通常我的程序会在 35 毫秒内调用该函数 10,000 次,但是在使用SortedList.Count时,它会减慢到 300-400 毫秒,基本上慢了 10 倍。

我也尝试过SortedList.Keys.Count,但这又将我的性能降低了 10 倍,超过 3000 毫秒。

I have only ~5000 keys/objects in SortedList<DateTime, object_name>. 我可以轻松地立即从排序列表中检索数据SortedList[date] (in 35 ms),因此我没有发现列表结构或其持有的对象有任何问题。

这种表现正常吗?

我还能使用什么来获取列表中的记录数,或者只是检查列表是否已填充?(除了添加一个单独的跟踪标志,我现在可以这样做)

更正:对不起,我实际上在使用: ConcurrentDictionary<string, SortedList<DateTime, string>> dict_list = new ConcurrentDictionary<string, SortedList<DateTime, string>>(); 而且我在各个地方都有各种计数,有时检查列表中的项目,有时检查 ConcurrentDicitonary 中的项目。所以这个问题适用于 ConcurrentDicitonary,我编写了快速测试代码来确认这一点,这需要 350 毫秒,而不使用并发。这是使用 ConcurrentDicitonary 进行的测试,显示 350 毫秒:

0 投票
1 回答
907 浏览

c# - BlockingCollection - 让消费者等待

使用Microsoft Docs中的第二个示例,当我有一个非阻塞消费者时,当 a 中没有项目时让消费者等待的首选方法是什么BlockingCollection?文档中的示例如下。

上面的示例用于SpinWait暂停消费者。

简单地使用以下命令可能会使 CPU 非常忙碌。

这里让消费者等待的首选方法是什么?我计划使用几个BlockingCollections 并寻找使用它的最佳方式。

0 投票
3 回答
1947 浏览

c# - 当不可变集合比并发更可取时

最近阅读了有关不可变集合的信息。当读取操作比写入更频繁地执行时,建议将它们用作读取的线程安全。

然后我想测试读取性能ImmutableDictionaryConcurrentDictionary. 这是这个非常简单的测试(在 .NET Core 2.1 中):

您可以运行此代码。以滴答为单位的经过时间会不时变化,但所花费的时间ConcurrentDictionary是 的几倍ImmutableDictionary

这个实验让我很尴尬。我做错了吗?如果我们有并发,使用不可变集合的原因是什么?什么时候更可取?

0 投票
1 回答
441 浏览

wpf - WPF 绑定到并发集合是否安全?

我想知道,将 WPF 控件绑定到并发集合是否安全,特别是围绕System.Collections.Concurrent也实现的集合之一的包装类INotifyCollectionChanged

我知道CollectionChanged必须在 UI 线程上调用(并且没有索引参数)。但是,如果另一个线程在 UI 更新自身时操作源集合,会发生什么情况?WPF 是否只是优雅地忽略了这个问题(就像在许多其他地方一样)?

0 投票
1 回答
57 浏览

c# - 并发集合是否缓存枚举器快照?

如果我理解正确,那么并发集合会创建一个快照作为循环中Enumerator使用的源,这需要锁定。foreach

他们是否每次都缓存快照或锁定?这是否会对性能产生潜在影响?我对微观测量持怀疑态度,因为它们很容易导致错误的结论,并且我试图了解内部工作原理。

谢谢!