Colecțiile introduse în .NET Framework 1.0 pot fi găsite în spațiul de nume System.Collections. Aceste colecții, inclusiv ArrayList și Hashtable, folosite frecvent, oferă un anumit tip de siguranță a firelor prin proprietatea Synchronized, care returnează un wrapper thread-safe legat colecției. Wrapper-ul funcționează prin blocarea întregului set pentru fiecare operație de adăugare sau eliminare. Prin urmare, fiecare fir de discuție care încearcă să acceseze colecția trebuie să aștepte până când îi vine rândul pentru a obține blocarea. Aceasta nu este scalabilă și va duce la o degradare semnificativă a performanței pentru colecțiile mari. În plus, acest design nu împiedică complet disputa. Pentru mai multe informații, consultați pagina următoare de pe site-ul MSDN: Sincronizarea în colecțiile generice
Clasa de colecție introdusă în .NET Framework 2.0 poate fi găsită în spațiul de nume System.Collections.Generic. Aceste clase de colecție includ <T>Listă, Dicționar< TKey, TValue> etc. Aceste clase oferă o securitate și performanță mai ridicată a tipurilor comparativ cu clasele .NET Framework 1.0. Totuși, clasa de colecție .NET Framework 2.0 nu oferă nicio sincronizare a firelor de execuție; Când se adaugă sau se elimină elemente pe mai multe fire simultane, codul utilizatorului trebuie să asigure toată sincronizarea.
Recomandăm să folosiți clasele de colecție concurentă în .NET Framework 4, deoarece acestea oferă nu doar siguranța tipurilor claselor de colecție .NET Framework 2.0, ci și o securitate a firelor de execuție mai eficientă și completă decât cea oferită de colecția .NET Framework 1.0.
Unele tipuri de colecții concurente folosesc mecanisme ușoare de sincronizare precum SpinLock, SpinWait, SemaphoreSlim și CountdownEvent, care sunt noi în .NET Framework 4. De obicei, tipurile de sincronizare de mai sus folosesc "busy spinning" pentru o perioadă scurtă de timp înainte de a introduce firul în starea efectivă de așteptare. Dacă timpul de așteptare este așteptat să fie foarte scurt, spinul va consuma mult mai puține resurse de calcul decât așteptarea, ceea ce implică conversii ale kernelului care vor consuma multe resurse. Pentru clasele de colecție care folosesc rotație, această eficiență înseamnă că mai multe fire pot adăuga și elimina elemente într-un ritm foarte rapid. Pentru mai multe informații despre limitare și blocare, vezi SpinLock și SpinWait. <T> Clasele ConcurrentQueue și ConcurrentStack<T> nu folosesc deloc blocări. În schimb, se bazează pe operațiuni Interblocate pentru siguranța firului.
ilustra
Deoarece clasele de colectare concurente suportă ICollection, ele oferă implementări pentru proprietățile IsSynchronized și SyncRoot, chiar dacă nu sunt legate. IsSynchronized returnează întotdeauna false, în timp ce SyncRoot este mereu nul (nimic în Visual Basic).
Tabelul următor listează tipurile de colecții din spațiul de nume System.Collections.Concurrent.
tip | descriere | BlockingCollection<T> | Oferă<T> orice tip de limitare și blocare pentru implementarea IProducerConsumerCollection. Pentru mai multe informații, consultați prezentarea generală a BlockingCollection. | ConcurrentDictionary<TKey, TValue> | Cheia/valoarea este o implementare sigură pentru thread-uri a dicționarului. | ConcurrentQueue<T> | Implementarea siguranței firelor de discuție a cozilor FIFO (primul intrat, primul ieșit). | ConcurrentStack<T> | Implementare sigură la thread a stivelor LIFO (ultimul intrat, primul ieșit). | ConcurrentBag<T> | Implementare sigură la fire de execuție a unei colecții de elemente în afara ordinii. | IProducerConsumerCollection<T> | tipurile trebuie implementate înBlockingCollectionInterfețe folosite în
|
|