试图了解ConcurrentDictionary的工作原理

时间:2015-01-29 16:18:19

标签: c# .net-4.0 concurrentdictionary

我想将值初始化为0(如果它尚不存在)。否则它应该增加现有值。

ConcurrentDictionary<int, int> dic = new ConcurrentDictionary<int, int>();
dic.AddOrUpdate(1, 0, (key, old) => old++);
dic.AddOrUpdate(2, 0, (key, old) => old++);

此时,字典的键为1和2,值为0。

        dic.AddOrUpdate(1, 0, (key, old) => old++);

此时,对于键1,值应为1,而对于键2,它应为0,但是,两者的值都为0.任何想法为什么?

2 个答案:

答案 0 :(得分:4)

你有一种误解:

dic.AddOrUpdate(1, 0, (key, old) => old++);
     

此时,对于键1,值应为1

当您使用old++时,它会在修改之前返回原始值以进行存储。就好像你做了相同的:

dic.AddOrUpdate(1, 0, (key, old) => 
{
    var original = old;
    old = old + 1;
    return original;
});

您希望++old返回修改后的值或只使用

dic.AddOrUpdate(1, 0, (key, old) => old + 1);

答案 1 :(得分:1)

试试这个:

dic.AddOrUpdate(1, 0, (key, old) => old + 1);

我认为因为旧版是Func&lt;&gt;的参数,所以无法修改。