如何将tryAdd多个条目实现为并发字典?

时间:2018-03-05 06:53:17

标签: c# concurrentdictionary

我有一个并发字典,我用它来做一些线程安全的功能。

例如,我有以下代码:

var  myConcurrenctDictionary= new ConcurrentDictionary<int,int>();
if (myConcurrenctDictionary.TryAdd(personId, personId) == false)
{
    throw new Exception("");
}

但是现在我需要一种线程安全的方法来尝试一次向并发字典添加多个值,如果失败则返回false并且不插入指定id的任何值。

那么,请你指导我如何实现它?

2 个答案:

答案 0 :(得分:1)

ConcurrentDictionary<TKey, TValue>类型公开了GetOrAdd方法,用于以线程安全的方式将不存在的键添加到字典中。 您似乎正在寻找一种批量添加多个项目的方法。假设您确实需要完全相同的功能,那么实现这一目标并不容易。遗憾的是,ConcurrentDictionary并没有向子代公开它的内部锁定机制(没有protected)。因此,您最好的选择是基于简单的CustomConcurrentDictionary类型而不是Dictionary<K, V>来实施新的ConcurrentDictionary<K, V>。您可以使用this code作为参考。

答案 1 :(得分:0)

您可以通过将IEnumerable传递给构造函数来创建ConcurrentDictionary,数据和所有内容。因此,要添加一系列条目,您可以这样做:

    var combined = new ConcurrentDictionary<string,string>
    (
        original.Concat(additional)
    );
    original = combined;

不幸的是,如果某个其他线程正在修改原始字典,那么这对你没什么帮助,所以你必须在引用周围实现一个额外的锁定机制。最后,你可能最好自己创作自己的课程(如Artak的答案)。