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; } |
试试
您可以使用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 |