关于c#:如何在ConcurrentDictionary中添加项目< string,IList< object>>

How to add the items in ConcurrentDictionary<string, IList<object>>

本问题已经有最佳答案,请猛点这里访问。

我有一个>的并发操作,比如说对象为工件。

我想添加一个新对象。对象通常包含键列表,我有一个函数来获取这些键。

如果键不存在,我知道如何添加到字典中,但是如果键已经存在,我不知道如何更新列表。任何帮助都将不胜感激

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public bool AddToken(Artifact artifact)
        {
            IList<string> terms = GetTerms(artifact);
            foreach(var term in terms)
            {
                if (ExistsTerm(term))
                {
                    termDictionary.AddOrUpdate(??)
                }else
                {
                    IList<Artifact> a = new List<Artifact>();
                    a.Add(artifact);
                    termDictionary.TryAdd(term, artifact);
                }

            }
            return true;
        }


试试termDictionary[] = 。这将同时进行添加和更新(并且它将防止重复的键异常(存在覆盖现有数据的风险)。


您可以使用addorupdate。

从概念上讲,addorupdate方法总是会导致集合中的值发生更改。

这些方法的要点是解决并发系统中具有时间性质的问题。对于多个线程,您无法预测在任何执行点都将在集合中找到哪些元素。

这是msdn示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class CD_GetOrAddOrUpdate
{
    // Demonstrates:
    //      ConcurrentDictionary<TKey, TValue>.AddOrUpdate()
    //      ConcurrentDictionary<TKey, TValue>.GetOrAdd()
    //      ConcurrentDictionary<TKey, TValue>[]
    static void Main()
    {
        // Construct a ConcurrentDictionary
        ConcurrentDictionary<int, int> cd = new ConcurrentDictionary<int, int>();

        // Bombard the ConcurrentDictionary with 10000 competing AddOrUpdates
        Parallel.For(0, 10000, i =>
        {
            // Initial call will set cd[1] = 1.  
            // Ensuing calls will set cd[1] = cd[1] + 1
            cd.AddOrUpdate(1, 1, (key, oldValue) => oldValue + 1);
        });

        Console.WriteLine("After 10000 AddOrUpdates, cd[1] = {0}, should be 10000", cd[1]);

        // Should return 100, as key 2 is not yet in the dictionary
        int value = cd.GetOrAdd(2, (key) => 100);
        Console.WriteLine("After initial GetOrAdd, cd[2] = {0} (should be 100)", value);

        // Should return 100, as key 2 is already set to that value
        value = cd.GetOrAdd(2, 10000);
        Console.WriteLine("After second GetOrAdd, cd[2] = {0} (should be 100)", value);
    }
}


ConcurrentDictionary GetOrAdd方法获取工厂委托:

1
2
var list = termDictionary.GetOrAdd(term, t=>new List<Artifact>());
list.Add(artifact);