ConcurrentDictionary的乐观并发Remove方法

时间:2012-01-04 07:46:39

标签: .net optimistic-concurrency

我在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样板,而How to: Add and Remove Items from a ConcurrentDictionary没有提到该方法任

有谁知道这是否可行,或者是否有其他方法我不知道?

2 个答案:

答案 0 :(得分:4)

虽然它不是官方文件,但this MSDN blog post可能会有所帮助。该文章的要点:如同问题中所述,转换为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));
}

答案 1 :(得分: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");
    }
}

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