.NET Framework 1.0:ssa esitellyt kokoelmat löytyvät System.Collections-nimiavaruudesta. Nämä kokoelmat, mukaan lukien yleisesti käytetty ArrayList ja Hashtable, tarjoavat jonkinlaisen säikeen turvan Synchronized-ominaisuuden kautta, joka palauttaa kokoelmaan liittyvän säiketurvallisen kääreen. Kääre toimii lukitsemalla koko setin jokaista lisäys- tai poistotoimintoa varten. Siksi jokaisen säikeen, joka yrittää päästä kokoelmaan, täytyy odottaa, kunnes on sen vuoro saada lukko. Tämä ei ole skaalautuvaa ja johtaa merkittävään suorituskyvyn heikkenemiseen suurissa kokoelmissa. Lisäksi tämä rakenne ei täysin estä kiistaa. Lisätietoja löytyy seuraavalta sivulta MSDN:n verkkosivuilta: Synkronointi yleiskokoelmissa
.NET Framework 2.0:ssa esitelty kokoelmaluokka löytyy System.Collections.Generic-nimiavaruudesta. Näihin kokoelmakursseihin kuuluvat List<T>, Sanakirja< TKey, TValue> jne. Nämä luokat tarjoavat korkeampaa tyyppiturvallisuutta ja suorituskykyä verrattuna .NET Framework 1.0 -luokat. .NET Framework 2.0 -kokoelmaluokka ei kuitenkaan tarjoa säikeiden synkronointia; Kun lisäät tai poistat kohteita useista säikeistä samanaikaisesti, käyttäjäkoodin on tarjottava kaikki synkronointi.
Suosittelemme käyttämään samanaikaisia kokoelmaluokkia .NET Framework 4:ssä, koska ne tarjoavat paitsi .NET Framework 2.0 -kokoelmaluokkien tyypin turvallisuuden, myös tehokkaamman ja täydellisemmän säikesuojan kuin .NET Framework 1.0 -kokoelman säiketurvallisuus.
Jotkut samanaikaiset kokoelmatyypit käyttävät kevyitä synkronointimekanismeja, kuten SpinLock, SpinWait, SemaphoreSlim ja CountdownEvent, jotka ovat uusia .NET Framework 4:ssä. Tyypillisesti yllä mainitut synkronointityypit käyttävät "kiireistä pyörimistä" lyhyen aikaa ennen kuin säie siirretään varsinaiseen odotustilaan. Jos odotusajan odotetaan olevan hyvin lyhyt, pyöritys kuluttaa paljon vähemmän laskentaresursseja kuin odotus, mikä sisältää ytimen muunnokset, jotka kuluttavat paljon resursseja. Kokoelmaluokissa, jotka käyttävät kiertoa, tämä tehokkuus tarkoittaa, että useat säikeet voivat lisätä ja poistaa esineitä erittäin nopeasti. Lisätietoja rajoittamisesta ja estämisestä löytyy SpinLockista ja SpinWaitista. ConcurrentQueue<T>- ja<T> ConcurrentStack-luokat eivät käytä lukkoja lainkaan. Sen sijaan ne luottavat lukittuihin toimintoihin säikeiden turvallisuuden varmistamiseksi.
havainnollistaa
Koska samanaikaiset kokoelmaluokat tukevat ICollectionia, ne tarjoavat toteutuksia IsSynchronized- ja SyncRoot-ominaisuuksille, vaikka ne olisivat toisistaan riippumattomia. IsSynchronized palauttaa aina epätosi, kun taas SyncRoot on aina null (Visual Basicissa ei mitään).
Seuraava taulukko listaa kokoelmatyypit System.Collections.Concurrent -nimiavaruudessa.
tyyppi | kuvaus | BlockingCollection<T> | Tarjoaa<T> kaikenlaista rajoitusta ja estettä IProducerConsumerCollectionin toteuttamiseen. Lisätietoja löytyy BlockingCollection-yleiskatsauksesta. | ConcurrentDictionary<TKey, TValue> | Avain/arvo on sanakirjan säike-turvallinen toteutus. | ConcurrentQueue<T> | FIFO (first in, first out) -jonojen säikeiden turvallisuustoteutus. | ConcurrentStack<T> | LIFO (last-in, first-out) -pinojen säikeäturvallinen toteutus. | ConcurrentBag<T> | Säikeiden turvallinen toteutus epäjärjestyksessä olevasta elementtikokoelmasta. | IProducerConsumerCollection<T> | tyypit on toteutettavaBlockingCollectionRajapinnat, joita käytetään
|
|