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

本文关键字:安全 线程 数据 Clear 函数 ConcurrentDictionary | 更新日期: 2023-09-27 18:21:11

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

像这样:"

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函数,它可以安全地返回字典中所有已清除的项。。

-Larry

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

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

您可以使用TryRemove(key, out value)方法。它返回删除的元素。这样就不必为了移动缓冲数据而锁定字典。

List<data> list;
var keys = dict.Keys;
foreach(var key in keys)
{
    data value;
    dict.TryRemove(key, out value);
    list.Add(value);
}

更新:实际上,您可以直接迭代ConcurrentDictionary,即使它正在更改。通过这种方式,您不必从属性.Keys构建键的集合,这可能(?)很慢,具体取决于实现。

List<data> list;
foreach(var kvp in dict)
{
    data value;
    dict.TryRemove(kvp.Key, out value);
    list.Add(value);
}