ConcurrentDictionary的乐观并发Remove方法

8

我正在寻找ConcurrentDictionary中的一种方法,该方法允许我仅在值等于我指定值时按键删除一个条目,类似于 TryUpdate 的删除等效方法。

唯一能够实现这个功能的方法似乎是这个方法:

ICollection<KeyValuePair<K, V>>.Remove(KeyValuePair<K, V> keyValuePair)

这是ICollection接口的显式实现,换句话说,我必须先将我的ConcurrentDictionary强制转换为ICollection,以便调用Remove方法。
Remove恰好符合我的要求,而且那个转换也没什么大不了的,源代码显示它调用了带有bool matchValue = true参数的私有方法TryRemovalInternal,所以看起来很干净整洁。
然而,让我有点担心的是,它没有被记录为ConcurrentDictionary的乐观并发Remove方法。因此,http://msdn.microsoft.com/en-us/library/dd287153.aspx只是复制了ICollection的样板内容,而How to: Add and Remove Items from a ConcurrentDictionary也没有提到该方法。
是否有人知道这是正确的方法,或者是否有其他我错过的方法?

看起来没问题(因为它是与“TryRemove”调用相同的方法,只是将“matchValue”设置为false并将“oldValue”默认化)。 - Damien_The_Unbeliever
2
虽然这不是官方文件,但它可能会有所帮助:http://blogs.msdn.com/b/pfxteam/archive/2011/04/02/10149222.aspx - alexm
@alexm 这足以令人放心 - 如果你把它变成一个答案,我会接受的!如果最近确实有“几个人要求进一步支持ConcurrentDictionary”,那么微软应该真正更新他们的文档。 - Evgeniy Berezovsky
这个回答解决了你的问题吗?如何在.NET ConcurrentDictionary中实现remove_if功能 - Theodor Zoulias
2个回答

6
虽然这不是官方文档,但这篇 MSDN 博客文章可能会有所帮助。该文章的要点是:将对象强制转换为ICollection并调用其Remove方法,就像问题描述的那样,这是正确的方法。
以下是以上博客文章中的片段,将其包装成一个TryRemove扩展方法:
public static bool TryRemove<TKey, TValue>(
    this ConcurrentDictionary<TKey, TValue> dictionary, TKey key, TValue value)
{
    if (dictionary == null)
      throw new ArgumentNullException("dictionary");
    return ((ICollection<KeyValuePair<TKey, TValue>>)dictionary).Remove(
        new KeyValuePair<TKey, TValue>(key, value));
}

0
如果你不需要ConcurrentDictionary的所有功能,你可以将你的类型声明为IDictionary。
public class ClassThatNeedsDictionary
{
    private readonly IDictionary<string, string> storage;

    public ClassThatNeedsDictionary()
    {
        storage = new ConcurrentDictionary<string, string>();
    }

    public void TheMethod()
    {
        //still thread-safe
        this.storage.Add("key", "value");
        this.storage.Remove("key");
    }
}

我发现这在只需要添加和删除,但仍需要线程安全迭代的情况下非常有用。


如果有使用ConcDic但不需要其专门方法的情况,我还没有遇到过。但如果有的话,您的建议肯定会使强制转换变得多余。另一方面,我相当确定这是一个“编译时强制转换”,因此完全没有性能损失。只是代码看起来有点丑陋。 - Evgeniy Berezovsky
在需要同时向字典中添加和删除对象的情况下进行迭代。由于ConcurrentDictionary提供了键快照,因此不会出现异常。 - greyalien007

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接