2017-02-02 23 views
7

Zawsze jestem zdezorientowany, który z nich wybrać. Jak ja to widzę Używam Dictionary nad List jeśli chcę dwa typy danych jako Key i Value więc mogę łatwo znaleźć wartości przez jej key ale zawsze jestem zdezorientowany, czy należy użyć ConcurrentDictionary lub Dictionary?Kiedy należy używać ConcurrentDictionary i Dictionary?

Zanim zgaśnie na mnie nie wprowadza wiele badań na tym próbowałem, ale wydaje google naprawdę nie dostał nic na Dictionary vs ConcurrentDictionary ale ma coś na każdego z nich indywidualnie.

Poprosiłem o to znajomego wcześniej, ale wszystko, co powiedzieli, brzmi: "użyj ConcurrentDictionary, jeśli używasz dużo słownika w kodzie", a ja naprawdę nie chciałem przeszkadzać im w wyjaśnianiu go w bardziej szczegółowy sposób. Czy ktokolwiek mógłby to rozwinąć?

+0

Po przeanalizowaniu informacji na temat każdego z tych obiektów indywidualnie, w jaki sposób nie udało się odpowiedzieć na pytanie, kiedy należy korzystać z każdego z nich? Jeśli wiesz, kiedy powinieneś używać 'Słownika' i kiedy powinieneś używać' ConcurrentDictionary', biorąc pod uwagę, że powiedziałeś, że już znalazłeś te informacje, to wiesz, kiedy powinieneś użyć jednego z nich. – Servy

+0

Typ nazwy wyjaśnia to samo.Używasz 'ConcurrentDictionary', gdy potrzebujesz Równoczesnego dostępu do Słownika. –

+0

użyj ConcurrentDictionary, jeśli będziesz uzyskiwać dostęp do słownika z wielu wątków. Oto, czym jest cała przestrzeń nazw 'System.Collections.Concurrent' dla – Jonesopolis

Odpowiedz

15

"Używaj ConcurrentDictionary, jeśli dużo słownika używasz w kodzie" to rodzaj niejasnej porady. Nie winię cię za zamieszanie.

ConcurrentDictionary jest podstawowym urządzeniem do pracy w środowisku, w którym można zaktualizować słownik z wielu wątków (lub zadań asynchronicznych). Można użyć standardowego Dictionary ze tyle kodu, jak chcesz, czy to z jednego wątku;)

Jeśli spojrzeć na sposobach na ConcurrentDictionary, można zauważyć kilka interesujących metod jak TryAdd, TryGetValue, TryUpdate i TryRemove.

Należy na przykład wziąć pod uwagę typowy wzór, który można zobaczyć w przypadku pracy z normalną klasą Dictionary.

// There are better ways to do this... but we need an example ;) 
if (!dictionary.ContainsKey(id)) 
    dictionary.Add(id, value); 

to ma problem, że pomiędzy sprawdzeniem, czy zawiera on klucz i nazywając Add inny wątek mógł zadzwonić Add z tej samej id. Kiedy ten wątek zadzwoni pod numer Add, wygeneruje wyjątek. Metoda TryAdd obsługuje to za Ciebie i zwróci wartość true/false informującą, czy ją dodała (lub czy ten klucz był już w słowniku).

Więc jeśli nie pracujesz w wielowątkowej sekcji kodu, prawdopodobnie możesz po prostu użyć standardowej klasy Dictionary. Biorąc to pod uwagę, teoretycznie możesz mieć blokady, aby zapobiec równoczesnemu dostępowi do słownika; to pytanie jest już adres w "Dictionary locking vs. ConcurrentDictionary".

+1

Dziękuję za odpowiedź, bardzo pomogło. Czy użycie ConcurrentDictionary wszędzie, nawet jeśli pochodzi z pojedynczego wątku, będzie tak złe? – Ashkru

+1

Czy możesz użyć formy innej niż współbieżne, jeśli robisz zapis przed stworzeniem wątków (jeden wielowątkowy, czyty tylko)? Mogę sobie wyobrazić, że jest to szybsze i nie mogę zobaczyć, jak może się zepsuć (dopóki nie zrobisz czegoś głupiego, na przykład napisz do niego). –

+0

Najprawdopodobniej nie ma problemu z używaniem 'ConcurrentDictionary', ale wyobrażam sobie, że będzie przynajmniej trochę narzutów, które zależą od tego, w jaki sposób słownik jest używany, mogą być wąskim gardłem. Jeśli chcesz porównać źródło, aby zobaczyć, co się dzieje, sprawdź źródło dla [ConcurrentDictionary.TryAddInternal()] (https://referencesource.microsoft.com/#mscorlib/system/Collections/Concurrent/ConcurrentDictionary.cs, bc495056297a0851) i [Dictionary.Insert()] (https://referencesource.microsoft.com/#mscorlib/system/collections/generic/dictionary.cs,fd1acf96113fbda9). –

0

ConcurrentDictionary jest przydatny, gdy trzeba uzyskać dostęp do słownika w wielu wątkach (tj. Wielowątkowość). Obiekty Vanilla Dictionary nie mają takiej możliwości i dlatego powinny być używane tylko w trybie jednowątkowym.

+0

Czy użycie ConcurrentDictionary wszędzie, nawet jeśli pochodzi z jednego wątku, byłoby tak złe? – Ashkru

+0

Nie, ponieważ dezorientujesz każdego czytającego twój kod później, jeśli nie planujesz wielowątkowości programu. Ponadto, oczekiwałbym dodatkowego obciążenia w dowolnej strukturze danych współbieżnych, ponieważ uprawnienia dostępu muszą być zarządzane przez wiele wątków. – Woody1193

+0

Mówisz "nie", a następnie kontynuuj, jak to źle, czy to źle? Powodem, dla którego pytam, jest to, że obecnie nie jest dostępny z innych wątków niż główny wątek, ale może w przyszłości. Czy warto używać rozwiązania Concurrent do obsługi wszystkich sposobów lub zmieniania kodu, jeśli zdecyduję się na implementację wielowątkowości? – Ashkru

0

Głównym powodem używania CocurrentDictionary przez Dictionary jest bezpieczeństwo wątków. Jeśli twoja aplikacja otrzyma wiele wątków używających tego samego słownika w tym samym czasie, potrzebujesz bezpiecznego wątku CocurrentDictionary, co jest szczególnie prawdziwe, gdy wątki te zapisują lub budują słownik.