Megosztás a következőn keresztül:


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. IsSynchronizedmindig visszatér false és SyncRoot mindig null (NothingVisual 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.
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.

Hivatkozás

System.Collections.Concurrent