41

W jaki sposób SynchronizedCollection<T> i zbieżne kolekcje w przestrzeni nazw System.Collections.Concurrent różnią się od siebie nawzajem, z tym że zbiory współbieżne są przestrzenią nazw, a SynchronizedCollection<T> jest klasą?Jaka jest różnica między SynchronizedCollection <T> a innymi współbieżnymi kolekcjami?

SynchronizedCollection<T> i wszystkie zajęcia w kolekcjach współbieżnych zapewniają zbiory bezpieczne dla wątków. Jak mogę zdecydować, kiedy należy korzystać z jednego na drugim i dlaczego?

+1

Sprawdźcie tutaj: http://stackoverflow.com/questions/1946520/why-are-there-no-concurrent-collections-in-c – StuartLC

Odpowiedz

50

Model SynchronizedCollection<T> class został wprowadzony jako pierwszy w .NET 2.0, aby zapewnić bezpieczną dla wątków klasę kolekcji. Robi to poprzez blokowanie, dzięki czemu zasadniczo masz List<T>, gdzie każdy dostęp jest zawijany w oświadczeniu lock.

Przestrzeń nazw jest dużo nowsza. Został wprowadzony dopiero w .NET 4.0 i zawiera znacznie ulepszony i bardziej różnorodny zestaw opcji. Klasy te nie używają już blokad w celu zapewnienia bezpieczeństwa wątków, co oznacza, że ​​powinny one lepiej skalować się w sytuacji, w której wiele wątków uzyskuje dostęp do ich danych jednocześnie. Jednak klasa implementująca interfejs IList<T> jest szczególnie nieobecna wśród tych opcji.

W przypadku wersji 4.0 systemu .NET Framework należy w miarę możliwości korzystać z jednej z kolekcji udostępnianych w przestrzeni nazw System.Collections.Concurrent. Podobnie jak przy wyborze między różnymi rodzajami kolekcji podanymi w System.Collections.Generic namespace, musisz wybrać ten, którego cechy i cechy najlepiej odpowiadają Twoim konkretnym potrzebom.

Jeśli kierujesz reklamy na starszą wersję platformy .NET Framework lub potrzebujesz klas kolekcji, która implementuje interfejs IList<T>, musisz wybrać klasę SynchronizedCollection<T>.

Ten artykuł w witrynie MSDN jest również warto się zapoznać: When to Use a Thread-Safe Collection

+0

Tak, mogę preferować System.Collections.Concurrent ponad SynchrinozedCollecction jak używam wersji 4.0 !! – Batrickparry

+1

Jeśli te nowe kolekcje jednoczesne nie używają blokad dla bezpieczeństwa wątków, w jaki sposób osiąga się współbieżność? – Matt

+2

@Matt: Różne sposoby. Odpowiedź jest prawdopodobnie dość skomplikowana, aby zasłużyć na własne pytanie. Ale dla inspiracji, spójrz tutaj: http://stackoverflow.com/questions/1688870/how-might-a-class-like-nets-concurrentbagt-be-implemented i tutaj: http://stackoverflow.com/questions/4785622/why-is-concurrentbagt-so-slow-in-net-4-0-am-i-doing-it-wrong (Czy przeczytałeś również artykuł MSDN, do którego się przyłączyłem? Zawiera on bardzo krótkie podsumowanie sztuczki, których używają zamiast blokowania, chociaż prawdopodobnie nie wystarczą do napisania własnej implementacji.) –