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ść?
Odpowiedz
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.
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. –
Tak, wewnętrznie używa wirtualizacji procesora, co umożliwia wielokrotne jednoczesne połączenia. – oleksii
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) –
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.
Cóż ... to jest dane. Czy to jedyny przypadek, w którym może się nie udać? –
@daveL - tak, kiedy występują wyjątki ... zobacz odpowiedź Oleksii. –
Dzięki za pomoc .. I + 1ed you –
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.
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). –
Taa i dokumentacja MSDN znana jest ze swojej klarowności i bezbłędności. –
Cóż, wydaje się to jasne i bezbłędne dla innych odpowiedzi. –