2012-07-16 26 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

當密鑰已存在於字典中時,它將失敗。

如果由於耗盡內存而無法添加該值,您將會得到一個異常。

相關問題