C# 正在等待所有线程在ConcurrentDictionary中完成写入

C# 正在等待所有线程在ConcurrentDictionary中完成写入,c#,multithreading,concurrency,concurrentdictionary,C#,Multithreading,Concurrency,Concurrentdictionary,有一个并发字典,它从不同的来源收集信息,并且每分钟刷新一次,并将收集的数据传递给另一个处理程序 var currentDictionarySnapshot = _currentDictionary; _currentDictionary = new ConcurrentDictionary<int, string>(); return new ReadOnlyDictionary<int, string>(currentDictionarySnapshot); var

有一个并发字典,它从不同的来源收集信息,并且每分钟刷新一次,并将收集的数据传递给另一个处理程序

var currentDictionarySnapshot = _currentDictionary;
_currentDictionary = new ConcurrentDictionary<int, string>();
return new ReadOnlyDictionary<int, string>(currentDictionarySnapshot);
var currentdirectionarysnapshot=\u currentdirectionary;
_currentDictionary=新的ConcurrentDictionary();
返回新的只读字典(currentDictionarySnapshot);
我需要的是让
currentDictionarySnapshot
等待所有引用它的线程完成编写,然后创建新的
ReadOnlyDictionary

ConcurrentDictionary
是否本机支持它,或者如果它不支持,我如何提供它?

从概念上讲,您似乎需要一个
ReaderWriterLockSlim
。“读者”将是写在字典里的线索。“作者”是复制词典的线索


请注意,内置RWL不可缩放。它们只是在内部为每个操作锁定一些数据结构。这会破坏ConcurrentDictionary的可伸缩性属性,ConcurrentDictionary通过锁条带化进行伸缩。

好吧,我提出的问题的解决方案是使用ManualResetEventSlim创建类并向其添加计数器。当阅读的时间即将到来时,我会像我用CONTRONTRON字典那样做这个类的快照,等待计数器变成0。

你可以考虑使用<代码>任务。当所有(TASK1,TASK2,…);
Method我的编写方法不是异步的,即使是异步的,区分主字典和快照的任务也会很麻烦。如何确保在计数降至零后不会再出现编写器?无论如何,这不是一个答案,因为它太模糊了。我制作了快照,并用一个新实例替换了这个类的实例。一个老的会留在他的作者那里,让他们完成。通过复制来拍摄快照不是即时的。随着时间的推移,你会得到一本被“抹黑”的字典。无论如何,这并不能回答如何等待写操作完成的问题。即使你是OP,你的答案与其他答案的标准是一样的。它不是通过复制来抓拍的,我创建了另一个对字典的引用,并从中生成只读字典。我让旧变量引用一个新的空字典,所以所有的新编写者都会使用一个新字典。我无法粘贴解决方案的全部代码,因为它受我的雇主限制。但我的回答会帮助我解决问题,我认为,这就是重点。创建另一个参考文献并不会阻止作者写旧的格言。他们可能仍然有旧的参考文献。你需要回答被问到的问题。这是您选择的最终方法并不重要。