2012-07-16 124 views
45

这是更多的学术问题......但可以ConcurrentDictionary.TryAdd失败?如果是这样,在什么情况下,为什么?可以ConcurrentDictionary.TryAdd失败?

+0

就目前来看,这个问题很模糊。 MSDN [page](http://msdn.microsoft.com/en-us/library/dd267291.aspx)记录了几个原因,例外和其他(如迄今为止提到的答案)。 – 2012-07-16 09:58:50

+9

是的,MSDN文档以其清晰和完美而闻名 – 2012-07-16 10:01:32

+1

那么,对于其他答案来说,它看起来清晰无瑕。 – 2012-07-16 10:02:23

回答

69

是的,可以,这里的条件是(from msdn):

  • ArgumentNullException - 当关键是空引用
  • 发生OverflowException - 当达到元素的最大数量
  • 它返回如果具有相同密钥的元素已存在

只是重申,这与并发无关。如果担心两个线程在同一时间插入一个项目,然后会出现以下情况:

  • 两个刀片做工精细,如果使用不同的密钥
  • 一个插入工作正常,返回true,其他插入失败(没有例外)并返回false。如果两个线程试图用同一个键插入一个项目,并且基本上只有一个线程会赢得另一个线程,则会发生这种情况
+4

好吧...所以与并发访问无关..它只是执行与标准字典相同的检查。 – 2012-07-16 09:59:36

+1

是的,它在内部使用CPU旋转,允许多个并发连接。 – oleksii 2012-07-16 10:02:53

+0

谢谢..我接受你的答案是最有建设性的。我们正在调试一个相当难以捉摸的bug,并逐一排除可能的来源。我可以根据您的贡献排除TryAdd(尽管如果添加失败,我仍会添加额外的日志记录) – 2012-07-16 10:06:14

6

当然可以。如果该键已经存在,该方法将返回false。

编号:http://msdn.microsoft.com/en-us/library/dd267291.aspx

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

+0

呃...这是一个给定的。这是唯一可能导致失败的情况吗? – 2012-07-16 09:55:50

+0

@daveL - 是的,当发生异常时...请参阅Oleksii的回答。 – 2012-07-16 10:01:06

+0

感谢您的帮助..我为您+1了 – 2012-07-16 10:07:19

2

当密钥已存在于字典中时,它将失败。

如果由于耗尽内存而无法添加该值,您将会得到一个异常。