并发字典AddOrUpdate与索引添加

本文关键字:索引 添加 AddOrUpdate 字典 并发 | 更新日期: 2023-09-27 18:25:25

在当前项目中,有两种方法可以为并发字典中的现有键赋值。

A。concurrentDictionary1[key] = value

B。concurrentDictionary2.AddOrUpdate(key, value, (k, v) => value);

如果我知道"钥匙"存在,这些功能是否等效?

方法"A"是否绕过了并发字典的并发性提供的保护?

这里有什么不同?选择其中一个而不是另一个的原因是什么?

我查看了msdn的文档,它们似乎只使用方法"a"初始化了一个并发字典,而没有更新它。

并发字典AddOrUpdate与索引添加

这是一个老问题,但没有人回答为什么要使用一个而不是另一个。

如果要添加或更新,并且更新不依赖于现有值,请选择A(索引器)。

如果要添加或更新,并且更新取决于现有值,请选择B(AddOrUpdate)。AddOrUpdate将以原子方式进行更新。

因此,在问题中的情况下,您希望使用索引器。它更简单、更容易阅读,而且可能更快,因为您没有创建匿名函数。

它们都调用TryAddInternal,因此行为完全相同**。

更新:

还有另一个区别。这是来自索引器的代码:

set
{
    TValue tValue;
    if (key == null)
    {
        throw new ArgumentNullException("key");
    }
    this.TryAddInternal(key, value, true, true, out tValue);
}

与。来自方法

while (!this.TryAddInternal(key, tValue, false, true, out tValue1));

因此,索引器可能会无声地失败,而方法将继续尝试,直到成功。嗯,需要进行更深入的分析才能完全理解两者之间的差异:/

解压缩程序仍然是你的朋友。

**我摔倒了。

如果我知道"钥匙"存在,这些功能是否等效?

你使用它的方式,是的。事实上,无论key是否存在,它们都是等价的。

选择其中一个而不是另一个的原因是什么?

AddOrUpdate接受用于更新值的函数。您只是使用它来直接设置值,但它被设计用于根据函数的结果以并发方式更新值。例如:

concurrentDictionary2.AddOrUpdate(key, value, (k, v) => v + value);  // adds value to the existing value

是等效的。不。索引器实际上是方法(就像属性一样),我不认为它们会绕过并发。方法