ConcurrentDictionary.TryAdd可以失败吗?

Dav*_*nce 65 c# concurrentdictionary

这更像是一个学术问题......但是ConcurrentDictionary.TryAdd会失败吗?如果是这样,在什么情况下,为什么?

ole*_*sii 95

是的它可以,这是条件(来自msdn):

  • ArgumentNullException - 当键为空引用时
  • OverflowException - 达到最大元素数时
  • 如果已存在具有相同键的元素,则返回false

重申一下,这与并发性无关.如果您担心两个线程同时插入一个项目,则可能发生以下情况:

  • 如果键不同,两个插件都可以正常工作
  • 一个插件工作正常并返回true,另一个插件失败(没有异常)并返回false.如果两个线程尝试插入具有相同键的项目,并且基本上只有一个线程将赢得另一个松散,则会发生这种情况.

  • 好的...所以与并发访问无关......它只是执行与标准字典相同的检查. (4认同)
  • @deveL 通常很难调试多线程应用程序。但我会相信“System.Collections.Concurrent”命名空间,因为它已经过广泛测试。也看看 [parallel nunit](http://www.nunit.org/index.php?p=pnunit&r=2.5)。我从未使用过它,但它似乎解决了并行代码单元测试的问题。如果您不使用 NUnit,则应该有其他框架。 (2认同)

Chr*_*ler 7

当然可以.如果密钥已存在,则该方法将返回false.

参考:http://msdn.microsoft.com/en-us/library/dd267291.aspx

返回值类型:System.Boolean如果键/值对已成功添加到ConcurrentDictionary,则为true.如果密钥已存在,则此方法返回false.