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

任何使ConcurrentDictionary线程安全的想法,其中值被导出到列表ex,并在该字典被清除之后.这样任何其他线程都无法在导出和清除之间添加数据.

像这样:

List<data> list;
list = (List<data>)_changedItems.Values; //get values before clearing
_changedItems.Clear();


并且使用函数_changedItems.AddOrUpdate通过其他线程完成添加

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

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

lock(object)
{
    List<data> list;
    list = (List<data>)_changedItems.Values;  
    _changedItems.Clear();
}

lock(object)
    _changedItems.AddOrUpdate

需要一个Clear-function,可以安全地从字典中返回所有已清除的项目.

-Larry

最佳答案 实际上,在序列中调用两个线程安全的方法并不能保证序列本身的原子性.你是正确的,锁定两个调用以获取值和清除是必要的.

点赞