6

在将值导出到列表 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

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

-拉里

4

2 回答 2

2

你可以使用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上迭代,即使它正在改变。这样您就不必从 property 构建键的集合.Keys,这可能会很慢(?),具体取决于实现。

List<data> list;
foreach(var kvp in dict)
{
    data value;
    dict.TryRemove(kvp.Key, out value);
    list.Add(value);
}
于 2012-04-24T17:14:15.957 回答
2

事实上,在一个序列中调用两个线程安全的方法并不能保证序列本身的原子性。你是对的,a lockover both call to get values and clear 是必要的。

于 2012-01-24T13:14:54.490 回答