C# 如何实现将多个条目添加到并发字典中?

C# 如何实现将多个条目添加到并发字典中?,c#,concurrentdictionary,C#,Concurrentdictionary,我有一个并发字典,我用它来做一些线程安全的功能 例如,我有以下代码: var myConcurrenctDictionary= new ConcurrentDictionary<int,int>(); if (myConcurrenctDictionary.TryAdd(personId, personId) == false) { throw new Exception(""); } var myConcurrenctDictionary=新的ConcurrentDic

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

例如,我有以下代码:

var  myConcurrenctDictionary= new ConcurrentDictionary<int,int>();
if (myConcurrenctDictionary.TryAdd(personId, personId) == false)
{
    throw new Exception("");
}
var myConcurrenctDictionary=新的ConcurrentDictionary();
if(myConcurrenctDictionary.TryAdd(personId,personId)==false)
{
抛出新异常(“”);
}
但是现在我需要一种线程安全的方法来尝试一次向并发字典添加多个值,该方法返回false,如果失败,则不插入指定id的任何值


那么,您能告诉我如何实现这一点吗?

ConcurrentDictionary类型公开了
GetOrAdd
方法,用于以线程安全的方式将不存在的密钥添加到字典中。
似乎您正在寻找一种方法,一次批量添加多个项目。假设您确实需要该功能,那么实现该功能并不容易。不幸的是,ConcurrentDictionary没有向子级公开其内部锁定机制(没有受保护的内容)。因此,您最好的选择是基于简单的
字典
类型实现一个新的
CustomConcurrentDictionary
,而不是
ConcurrentDictionary
。您可以将其用作参考。

通过将IEnumerable传递给构造函数,您可以创建ConcurrentDictionary、data和all。因此,要添加一系列条目,可以执行以下操作:

    var combined = new ConcurrentDictionary<string,string>
    (
        original.Concat(additional)
    );
    original = combined;
var组合=新的ConcurrentDictionary
(
原件。Concat(附加)
);
原始=合并;

不幸的是,如果其他线程正在修改原始字典,这对您没有多大帮助,因此您必须围绕引用实现额外的锁定机制。最后,您最好创建自己的类(如Artak的回答所示)。

如果线程1添加多个条目,线程2添加其中一个条目,会发生什么情况?我希望失败,并且不添加该线程的任何条目(类似于事务所有条目成功或全部失败)然后,您可能需要在插入过程中锁定,这有点妨碍了并发字典的使用
ConcurrentDictionary
无法(并非设计为)做到这一点,因此您必须求助于常规锁定。即使您可以访问锁定机制,
ConcurrentDictionary
一次只锁定其中一个哈希桶。因此,如果您要添加多个条目(可能会在不同的存储桶中结束),您可能很难尝试利用框架代码。同意,这就是为什么我只是将该代码作为参考,而不是按原样使用,并在顶部添加方法。