Thread-Safe gyűjtemények
A .NET-keretrendszer 4 bemutatja a System.Collections.Concurrent névteret, amely több, szálbiztos és méretezhető gyűjteményosztályt tartalmaz. Több szál is biztonságosan és hatékonyan adhat hozzá vagy távolíthat el elemeket ezekből a gyűjteményekből anélkül, hogy további szinkronizálásra lenne szükség a felhasználói kódban. Új kód írásakor használja az egyidejű gyűjteményosztályokat, amikor egyszerre több szál ír a gyűjteménybe. Ha csak megosztott gyűjteményből olvas, akkor használhatja a névtérben lévő System.Collections.Generic osztályokat. Azt javasoljuk, hogy csak akkor használjon 1.0-s gyűjteményosztályokat, ha az 1.1-.NET-keretrendszer vagy korábbi futtatókörnyezetet kell használnia.
Szálszinkronizálás az .NET-keretrendszer 1.0-s és 2.0-s gyűjteményeiben
Az .NET-keretrendszer 1.0-s verzióban bevezetett gyűjtemények a System.Collections névtérben találhatók. Ezek a gyűjtemények, amelyek magukban foglalják a gyakran használt ArrayList és Hashtable, némi szálbiztonságot biztosítanak a Synchronized
tulajdonságon keresztül, amely szálbiztos burkolót ad vissza a gyűjtemény körül. A burkoló úgy működik, hogy minden hozzáadási vagy eltávolítási műveletnél zárolja a teljes gyűjteményt. Ezért minden szálnak, amely megpróbálja elérni a gyűjteményt, meg kell várnia, amíg sorra veszi az egyetlen zárolást. Ez nem skálázható, és jelentős teljesítménycsökkenést okozhat a nagy gyűjtemények esetében. A kialakítás nem teljesen védett a versenyhelyzetektől. További információ: Szinkronizálás az általános gyűjteményekben.
A .NET-keretrendszer 2.0-s verzióban bevezetett gyűjteményosztályok a System.Collections.Generic névtérben találhatók. Ezek közé tartoznak a List<T>következők: , Dictionary<TKey,TValue>és így tovább. Ezek az osztályok jobb típusbiztonságot és teljesítményt biztosítanak az .NET-keretrendszer 1.0 osztályokhoz képest. A .NET-keretrendszer 2.0 gyűjteményosztályok azonban nem biztosítanak szálszinkronizálást; a felhasználói kódnak minden szinkronizálást biztosítania kell, ha az elemeket egyszerre több szálon is hozzáadja vagy eltávolítja.
Javasoljuk, hogy az egyidejű gyűjteményosztályokat a .NET-keretrendszer 4-ben, mert nem csak a .NET-keretrendszer 2.0 gyűjteményosztályok típusát biztosítják, hanem a .NET-keretrendszer 1.0 gyűjtemények által biztosítottnál hatékonyabb és teljesebb szálbiztonságot is biztosítanak.
Fine-Grained zárolási és Lock-Free mechanizmusok
Az egyidejű gyűjteménytípusok némelyike olyan egyszerűsített szinkronizálási mechanizmusokat használ, SpinWaitSemaphoreSlimCountdownEventmint például SpinLocka 4. .NET-keretrendszer. Ezek a szinkronizálási típusok általában foglalt pörgetést használnak rövid időszakokra, mielőtt a szál valódi várakozási állapotba kerülnének. Ha a várakozási idők várhatóan nagyon rövidek lesznek, a fonás sokkal kevésbé számításigényes, mint a várakozás, ami költséges kernelváltást igényel. A forgót használó gyűjteményosztályok esetében ez a hatékonyság azt jelenti, hogy több szál nagyon nagy sebességgel adhat hozzá és távolíthat el elemeket. További információ a pörgetésről és a blokkolásról: SpinLock és SpinWait.
Az ConcurrentQueue<T> osztályok és ConcurrentStack<T> az osztályok egyáltalán nem használnak zárolást. Ehelyett műveletekre Interlocked támaszkodnak a szálbiztonság elérése érdekében.
Megjegyzés
Mivel az egyidejű gyűjteményosztályok támogatják ICollection, implementációkat biztosítanak a IsSynchronized tulajdonságokhoz, SyncRoot még akkor is, ha ezek a tulajdonságok irrelevánsak. IsSynchronized
mindig visszatér false
és SyncRoot
mindig null
(Nothing
Visual Basic).
Az alábbi táblázat a névtérben található System.Collections.Concurrent gyűjteménytípusokat sorolja fel.
Típus | Description |
---|---|
BlockingCollection<T> | Határoló és blokkoló funkciókat biztosít minden implementáló IProducerConsumerCollection<T>típushoz. További információt a BlockingCollection áttekintésében talál. |
ConcurrentDictionary<TKey,TValue> | Kulcs-érték párok szótárának szálbiztos implementálása. |
ConcurrentQueue<T> | Egy FIFO -üzenetsor szálbiztos implementálása (first-in, first-out). |
ConcurrentStack<T> | LiFO -verem szálbiztos implementálása (last-in, first-out). |
ConcurrentBag<T> | Az elemek rendezetlen gyűjteményének szálbiztos implementálása. |
IProducerConsumerCollection<T> | Az a felület, amelyet egy típusnak implementálnia kell ahhoz, hogy egy BlockingCollection . |
Kapcsolódó témakörök
Cím | Leírás |
---|---|
BlockingCollection – áttekintés | A típus által BlockingCollection<T> biztosított funkciókat ismerteti. |
Útmutató: Elemek hozzáadása és eltávolítása a ConcurrentDictionary elemből | A cikk azt ismerteti, hogyan adhat hozzá és távolíthat el elemeket a ConcurrentDictionary<TKey,TValue> |
Útmutató: Elemek felvétele és felvétele egy BlockingCollection elemből | Ez a cikk azt ismerteti, hogyan vehet fel és kérdezhet le elemeket blokkoló gyűjteményből írásvédett enumerátor használata nélkül. |
Útmutató: Határoló és blokkoló funkciók hozzáadása gyűjteményhez | Ismerteti, hogyan használható bármely gyűjteményosztály egy gyűjtemény mögöttes tárolási mechanizmusaként IProducerConsumerCollection<T> . |
Útmutató: BlockingCollection elemeinek eltávolítása a ForEach használatával | Ez a cikk azt ismerteti, hogyan távolíthatja el a letiltó gyűjtemény összes elemét a (For Each Visual Basic) használatávalforeach . |
Útmutató: Blokkoló gyűjtemények tömbjeinek használata folyamatban | Azt ismerteti, hogyan lehet egyszerre több blokkoló gyűjteményt használni egy folyamat implementálásához. |
Útmutató: Objektumkészlet létrehozása concurrentBag használatával | Bemutatja, hogyan javíthatja a teljesítményt egy egyidejű zsák használatával olyan helyzetekben, amikor az objektumok újra felhasználhatók az újak folyamatos létrehozása helyett. |