Samlingar som introduceras i .NET Framework 1.0 finns i System.Collections-namnrymden. Dessa samlingar, inklusive den vanligt använda ArrayList och Hashtable, ger någon form av trådsäkerhet genom egenskapen Synchronized, som returnerar en trådsäker wrapper relaterad till samlingen. Wrappern fungerar genom att låsa hela uppsättningen för varje tilläggs- eller borttagningsoperation. Därför måste varje tråd som försöker komma åt samlingen vänta tills det är dess tur att få låset. Detta är inte skalbart och kommer att leda till en betydande prestandaförsämring för stora samlingar. Dessutom förhindrar denna design inte helt konkurrens. För mer information, se följande sida på MSDN:s webbplats: Synkronisering i generiska samlingar
Samlingsklassen som introducerades i .NET Framework 2.0 finns i namnrymden System.Collections.Generic. Dessa samlingsklasser inkluderar Lista<T>, Ordbok< TKey, TValue> etc. Dessa klasser ger högre typsäkerhet och prestanda jämfört med .NET Framework 1.0-klasser. Dock tillhandahåller inte .NET Framework 2.0-samlingsklassen någon trådsynkronisering; När man lägger till eller tar bort objekt i flera trådar samtidigt måste användarkoden tillhandahålla all synkronisering.
Vi rekommenderar att du använder samtidiga samlingsklasser i .NET Framework 4 eftersom de inte bara ger typsäkerheten hos .NET Framework 2.0-samlingsklasserna, utan också mer effektiv och komplett trådsäkerhet än trådsäkerheten som tillhandahålls av .NET Framework 1.0-samlingen.
Vissa samtidiga samlingstyper använder lättviktssynkroniseringsmekanismer såsom SpinLock, SpinWait, SemaphoreSlim och CountdownEvent, vilka är nya i .NET Framework 4. Vanligtvis använder ovanstående synkroniseringstyper "busy spinning" under en kort tid innan tråden sätts i det faktiska väntläget. Om väntetiden förväntas vara mycket kort kommer spinnet att förbruka mycket mindre beräkningsresurser än väntan, vilket innebär kärnkonverteringar som kommer att förbruka mycket resurser. För samlingsklasser som använder rotation innebär denna effektivitet att flera trådar kan lägga till och ta bort objekt i mycket hög takt. För mer information om begränsningar och blockering, se SpinLock och SpinWait. ConcurrentQueue-<T> och<T> ConcurrentStack-klasserna använder inga lås alls. Istället förlitar de sig på Interlock-funktioner för trådsäkerhet.
illustrera
Eftersom samtidiga samlingsklasser stödjer ICollection tillhandahåller de implementationer för egenskaperna IsSynchronized och SyncRoot, även om de inte är relaterade. IsSynchronized returnerar alltid false, medan SyncRoot alltid är null (inget i Visual Basic).
Följande tabell listar samlingstyperna i System.Collections.Concurrent-namnrymden.
typ | beskrivning | BlockingCollection<T> | Erbjuder<T> alla typer av strypning och blockering för implementering av IProducerConsumerCollection. För mer information, se BlockingCollection-översikt. | ConcurrentDictionary<TKey, TValue> | Key/value är en trådsäker implementation av ordboken. | ConcurrentQueue<T> | Trådsäkerhetsimplementering av FIFO (först in, först ut) köer. | ConcurrentStack<T> | Trådsäker implementering av LIFO (last-in, first-out) stackar. | ConcurrentBag<T> | Trådsäker implementering av en oordningsbaserad samling av element. | IProducerConsumerCollection<T> | typer måste implementeras iBlockingCollectionGränssnitt som används i
|
|