等待所有线程完成写入 ConcurrentDictionary
Waiting for all threads to finish writing in ConcurrentDictionary
有一个并发字典,它从不同的来源收集信息,应该每分钟刷新一次并将收集的数据传递给另一个处理程序。
var currentDictionarySnapshot = _currentDictionary;
_currentDictionary = new ConcurrentDictionary<int, string>();
return new ReadOnlyDictionary<int, string>(currentDictionarySnapshot);
我需要的是让 currentDictionarySnapshot
等待所有引用它的线程完成写入并在之后创建新的 ReadOnlyDictionary
。
ConcurrentDictionary
本机支持它吗?如果不支持,我该如何提供?
从概念上讲,您似乎需要 ReaderWriterLockSlim
。 "Readers" 将是写入字典的线程。 "writer" 是复制字典的线程。
请注意,内置的 RWL 无法缩放。它们只是为每个操作在内部锁定一些数据结构。这破坏了 ConcurrentDictionary
的可扩展性 属性,后者通过锁条带化进行扩展。
好吧,我为我的问题所做的解决方案是使用 ManualResetEventSlim 创建 class 并向其添加计数器。当阅读时间到了时,我会像使用 ConcurrentDictionary 一样制作此 class 的快照并等待计数器变为 0。
有一个并发字典,它从不同的来源收集信息,应该每分钟刷新一次并将收集的数据传递给另一个处理程序。
var currentDictionarySnapshot = _currentDictionary;
_currentDictionary = new ConcurrentDictionary<int, string>();
return new ReadOnlyDictionary<int, string>(currentDictionarySnapshot);
我需要的是让 currentDictionarySnapshot
等待所有引用它的线程完成写入并在之后创建新的 ReadOnlyDictionary
。
ConcurrentDictionary
本机支持它吗?如果不支持,我该如何提供?
从概念上讲,您似乎需要 ReaderWriterLockSlim
。 "Readers" 将是写入字典的线程。 "writer" 是复制字典的线程。
请注意,内置的 RWL 无法缩放。它们只是为每个操作在内部锁定一些数据结构。这破坏了 ConcurrentDictionary
的可扩展性 属性,后者通过锁条带化进行扩展。
好吧,我为我的问题所做的解决方案是使用 ManualResetEventSlim 创建 class 并向其添加计数器。当阅读时间到了时,我会像使用 ConcurrentDictionary 一样制作此 class 的快照并等待计数器变为 0。