2012-07-16 9 views
45

To jest bardziej akademickie pytanie ... ale czy ConcurrentDictionary.TryAdd może się nie powieść? A jeśli tak, to w jakich przypadkach i dlaczego?Czy ConcurrentDictionary.TryAdd może się nie powieść?

+0

W obecnej wersji to pytanie jest dość ogólnikowe. MSDN [strona] (http://msdn.microsoft.com/en-us/library/dd267291.aspx) dokumentuje kilka powodów, wyjątkowych i innych (jak dotychczas wspomniano w odpowiedziach). –

+9

Taa i dokumentacja MSDN znana jest ze swojej klarowności i bezbłędności. –

+1

Cóż, wydaje się to jasne i bezbłędne dla innych odpowiedzi. –

Odpowiedz

69

Tak można, tutaj są warunki (from msdn):

  • ArgumentNullException - gdy kluczyk jest null odniesienia
  • OverflowException - gdy została osiągnięta maksymalna liczba elementów
  • It zwraca false jeśli element z tym samym kluczem już istnieje

Tylko powtórzyć, nie ma to nic wspólnego ze współbieżnością. Jeśli martwisz się o dwa wątki wstawiania elementu w tym samym czasie, to może dojść do następujących:

  • Obie wkładki działać dobrze, jeśli klucze są różne
  • Jedna wkładka działa prawidłowo i zwraca true, druga wkładka nie (bez wyjątku) i zwraca wartość false. Dzieje się tak, gdy dwa wątki próbują wstawić przedmiot z tym samym kluczem i zasadniczo tylko jeden wygrałby drugi.
+4

Ok ... więc nic wspólnego z dostępem współbieżnym ... to po prostu wykonuje te same kontrole, które trzeba wykonać ze standardowym słownikiem. –

+1

Tak, wewnętrznie używa wirtualizacji procesora, co umożliwia wielokrotne jednoczesne połączenia. – oleksii

+0

Dzięki .. Przyjmuję twoją odpowiedź jako najbardziej konstruktywną. Debagujemy tutaj o dość nieuchwytnym błędzie i wykluczamy potencjalne źródła linii po linii. Mogę wykluczyć TryAdd na podstawie tego, co włożyłeś (chociaż nadal będę dodawał dodatkowe logowanie w przypadku nieudanego dodania) –

6

Pewnie, że może. Jeśli klucz już istnieje, metoda zwróci wartość false.

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

Return Value Typ: System.Boolean true, jeśli para klucz/wartość została dodana do ConcurrentDictionary pomyślnie. Jeśli klucz już istnieje, ta metoda zwraca wartość false.

+0

Cóż ... to jest dane. Czy to jedyny przypadek, w którym może się nie udać? –

+0

@daveL - tak, kiedy występują wyjątki ... zobacz odpowiedź Oleksii. –

+0

Dzięki za pomoc .. I + 1ed you –

2

Nie powiedzie się, gdy klucz już istnieje w słowniku.

Jeśli nie można dodać wartości, ponieważ zabraknie pamięci, zamiast tego otrzymasz wyjątek.

Powiązane problemy