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
事实上,在序列中调用两个线程安全的方法并不能保证序列本身的原子性。您是对的,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);
}