A .NET Framework 1.0-ban bevezetett gyűjtemények megtalálhatók a System.Collections névtérben. Ezek a gyűjtemények, beleértve a gyakran használt ArrayList és a Hashtable-t is, valamilyen szálbiztonságot biztosítanak a Synchronized tulajdonságon keresztül, amely egy szál-biztonságos wrappert ad vissza a gyűjteményhez. A csomagolás úgy működik, hogy minden hozzáadás-eltávolítás művelethez az egész készletet zárolja. Ezért minden szálnak, amely megpróbál hozzáférni a gyűjteményhez, várnia kell, amíg az ő sora a zár megszerzésére. Ez nem skálázható, és jelentős teljesítményromlást eredményez a nagy gyűjteményeknél. Ezen felül ez a kialakítás nem zárja ki teljesen a vitát. További információért lásd az MSDN honlapján található alábbi oldalt: Szinkronizáció általános gyűjteményekben
A .NET Framework 2.0-ban bevezetett gyűjteményosztály a System.Collections.Generic névtérben található. Ezek a gyűjtemény órák közé tartozik a List<T>, Dictionary< TKey, TValue> stb. Ezek az osztályok magasabb típusbiztonságot és teljesítményt nyújtanak, mint a .NET Framework 1.0 osztályok. Azonban a .NET Framework 2.0 gyűjteményosztály nem biztosít szálszinkronizációt; Amikor egyszerre több szálon elemeket adunk vagy távolítanak, a felhasználói kódnak minden szinkronizálást biztosítania kell.
Javasoljuk, hogy használj párhuzamos gyűjteményosztályokat a .NET Framework 4-ben, mert ezek nemcsak a .NET Framework 2.0 gyűjteményosztályok típusbiztonságát biztosítják, hanem hatékonyabb és teljesebb szálbiztonságot is, mint a .NET Framework 1.0 gyűjtemény által biztosított szálbiztonság.
Néhány egyidejű gyűjteménytípus könnyű szinkronizációs mechanizmusokat használ, mint például a SpinLock, SpinWait, SemaphoreSlim és CountdownEvent, amelyek újak a .NET Framework 4-ben. Általában a fenti szinkronizációs típusok rövid ideig "foglalt forgást" használnak, mielőtt a szálat tényleges várakozási állapotba helyeznék. Ha a várakozási idő nagyon rövid lesz, a pörgés sokkal kevesebb számítási erőforrást fog fogyasztani, mint a várakozás, ami kernel-átalakításokat igényel, amelyek sok erőforrást fogyasztanak. A rotációt használó gyűjtő osztályok esetében ez a hatékonyság azt jelenti, hogy több szál is nagyon gyors ütemben hozzáadhat és távolíthatja el a tárgyakat. További információért a korlátozásról és blokkolásról lásd a SpinLock és a SpinWait oldalakat. A ConcurrentQueue<T> és ConcurrentStack<T> osztályok egyáltalán nem használnak zárolásokat. Ehelyett a szál biztonsága érdekében összekapcsolt műveletekre támaszkodnak.
illusztrál
Mivel az egyidejű gyűjteményosztályok támogatják az ICollectiont, megvalósítást biztosítanak az IsSynchronized és SyncRoot tulajdonságokhoz, még akkor is, ha ezek nem kapcsolódnak egymáshoz. Az IsSynchronized mindig hamisat ad vissza, míg a SyncRoot mindig null (Semmi a Visual Basic-ben).
Az alábbi táblázat a System.Collections.Concurrent névtérben található gyűjteménytípusokat sorolja fel.
típus | leírás | BlockingCollection<T> | <T> Bármilyen típusú korlátozást és blokkolást biztosít az IProducerConsumerCollection megvalósításához. További információért lásd: BlockingCollection áttekintés. | ConcurrentDictionary<TKey, TValue> | A kulcs/érték a szótár szál-biztonságos megvalósítása. | ConcurrentQueue<T> | FIFO (first be, first out) sorok szálbiztonsági megvalósítása. | ConcurrentStack<T> | Szálbiztonságú megvalósítás a LIFO (last-in, first-out) veremekhez. | ConcurrentBag<T> | Egy sorrendben kívüli elemgyűjtemény szál-biztonságos megvalósítása. | IProducerConsumerCollection<T> | A típusokat meg kell valósítaniBlockingCollectiona
|
|