ConcurrentDictionary乐观并发的Remove方法

我在ConcurrentDictionary中寻找一个方法,它允许我通过键删除一个条目,当且仅当该值等于我指定的值时,类似于TryUpdate的等价物,但是用于删除。

这样做的唯一方法似乎是这种方法:

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

它是ICollection接口的显式实现,换句话说,我必须先将我的ConcurrentDictionary转换为ICollection,以便我可以调用Remove。

删除不完全是我想要的,并且该转换也没有什么大不了的,源代码也显示它调用了私有方法TryRemovalInternal和bool matchValue = true,所以它看起来很漂亮,干净。

然而令我担心的是,它没有被记录为ConcurrentDictionary的乐观并发Remove方法,所以http://msdn.microsoft.com/en-us/library/dd287153.aspx只是复制了ICollection样板文件,并且如何:从ConcurrentDictionary添加和删除项目也没有提及该方法。

有谁知道如果这是要走的路,还是有一些其他方法,我错过了?


虽然它不是一个官方文档,但这个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));
}

如果你不需要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");
    }
}

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

链接地址: http://www.djcxy.com/p/57111.html

上一篇: ConcurrentDictionary's optimistically concurrent Remove method

下一篇: hbase.MasterNotRunningException while creating table in Hbase