ConcurrentDictionary 和 Clear() 函数。使值导出线程安全而不会丢失数据

use*_*983 5 c# multithreading dictionary thread-safety concurrentdictionary

在将值导出到列表 ex 的情况下以及在清除该字典之后使 ConcurrentDictionary 线程安全的任何想法。这样任何其他线程都无法在导出和清除之间添加数据。

像这样: ”

List<data> list;
list = (List<data>)_changedItems.Values; //get values before clearing
_changedItems.Clear();
Run Code Online (Sandbox Code Playgroud)

" 并且添加是由其他线程使用函数 _changedItems.AddOrUpdate 完成的

现在,如果某个线程在清除行之前将数据对象添加到集合中,则在从字典中获取数据和清除内容之间可能会丢失新数据。

或者是添加和清除内部锁的唯一方法。

lock(object)
{
    List<data> list;
    list = (List<data>)_changedItems.Values;  
    _changedItems.Clear();
}
Run Code Online (Sandbox Code Playgroud)

lock(object)
    _changedItems.AddOrUpdate
Run Code Online (Sandbox Code Playgroud)

需要一个清除函数来安全地从字典中返回所有已清除的项目。

-拉里

Tud*_*dor 2

事实上,在一个序列中调用两个线程安全方法并不能保证序列本身的原子性。你是对的,lock通过两次调用来获取值和清除是必要的。