Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Obor názvů System.Collections.Concurrent zahrnuje několik tříd kolekcí, které jsou bezpečné pro přístup z více vláken i škálovatelné. Více vláken může bezpečně a efektivně přidávat nebo odebírat položky z těchto kolekcí bez nutnosti další synchronizace v uživatelském kódu. Při psaní nového kódu použijte souběžné třídy kolekce k zápisu více vláken do kolekce souběžně. Pokud čtete jenom ze sdílené kolekce, použijte třídy v System.Collections.Generic oboru názvů.
System.Collections a System.Collections.Generic
Třídy kolekce v System.Collections oboru názvů zahrnují ArrayList a Hashtable. Tyto třídy poskytují určitou bezpečnost při práci s vlákny prostřednictvím Synchronized vlastnosti, která vrací bezpečnostní obálku vláken kolem kolekce. Obálka funguje tak, že při každé operaci přidání nebo odebrání uzamkne celou kolekci. Proto každé vlákno, které se pokouší o přístup ke kolekci, musí počkat na svoji příležitost získat jeden zámek. Tento proces není škálovatelný a může způsobit významné snížení výkonu u velkých kolekcí. Návrh také není chráněn před podmínkami časování. Další informace naleznete v tématu Synchronizace v obecných kolekcích.
Třídy kolekce v System.Collections.Generic oboru názvů zahrnují List<T> a Dictionary<TKey,TValue>. Tyto třídy poskytují vyšší bezpečnost typů a výkon ve srovnání s třídami System.Collections. Třídy System.Collections.Generic však neposkytují žádnou synchronizaci vláken; uživatelský kód musí poskytovat veškerou synchronizaci, pokud jsou položky přidány nebo odebrány na více vláknech současně.
Doporučujeme používat souběžné třídy kolekcí v System.Collections.Concurrent oboru názvů, protože poskytují bezpečnost typů a také efektivnější a kompletní zabezpečení vláken.
Jemně odstupňované uzamykání a mechanismy bez zámků
Některé ze souběžných typů kolekcí používají odlehčené synchronizační mechanismy, jako SpinLock, SpinWait, SemaphoreSlim a CountdownEvent. Tyto typy synchronizace obvykle používají zaneprázdněné otáčení po krátkou dobu předtím, než umístí vlákno do skutečného Wait stavu. Pokud se očekává, že doba čekání bude krátká, rotace je mnohem méně výpočetně náročná než čekání, což zahrnuje nákladný přechod jádra. U kolekčních tříd, které používají spinování, tato efektivita umožňuje, že více vláken může přidávat a odebírat položky ve vysoké rychlosti. Další informace o otáčení a blokování naleznete v tématu SpinLock a SpinWait.
ConcurrentQueue<T> třídy ConcurrentStack<T> vůbec nepoužívají zámky. Místo toho spoléhají na Interlocked operace, aby dosáhli bezpečnosti vláken.
Poznámka:
Vzhledem k tomu, že souběžné třídy kolekcí podporují ICollection, poskytují implementace pro vlastnosti IsSynchronized , SyncRoot i když tyto vlastnosti jsou irelevantní.
IsSynchronized vždy vrací false a SyncRoot je vždy null (Nothing v jazyce Visual Basic).
Následující tabulka uvádí typy kolekcí v System.Collections.Concurrent oboru názvů:
| Typ | Popis |
|---|---|
| BlockingCollection<T> | Poskytuje ohraničující a blokující funkce pro jakýkoli typ, který implementuje IProducerConsumerCollection<T>. Další informace naleznete v části BlockingCollection – přehled. |
| ConcurrentDictionary<TKey,TValue> | Implementace slovníku párů klíč-hodnota v bezpečném vlákně |
| ConcurrentQueue<T> | Implementace fronty FIFO (first-in, first-out) bezpečná pro přístup z více vláken. |
| ConcurrentStack<T> | Implementace vlákny bezpečného LIFO (poslední dovnitř, první ven) zásobníku. |
| ConcurrentBag<T> | Implementace neseřazené kolekce prvků bezpečná pro vlákno. |
| IProducerConsumerCollection<T> | Rozhraní, které typ musí implementovat, aby bylo použito v objektu BlockingCollection. |
Související články
| Titulek | Popis |
|---|---|
| BlockingCollection – přehled | Popisuje funkce poskytované typem BlockingCollection<T> . |
| Postupy: Přidávání a odebírání položek ze slovníku ConcurrentDictionary | Popisuje, jak přidávat a odebírat elementy z objektu ConcurrentDictionary<TKey,TValue> |
| Postupy: Přidání a převzetí položek jednotlivě z BlockingCollection | Popisuje, jak přidávat a načítat položky z blokující kolekce bez použití enumerátoru jen pro čtení. |
| Postupy: Přidání ohraničující a blokující funkce do kolekce | Popisuje, jak používat kteroukoliv třídu kolekce jako základní mechanismus ukládání pro kolekci IProducerConsumerCollection<T>. |
| Postupy: Použití příkazu ForEach k odebrání položek v BlockingCollection | Popisuje použití foreach (For Each v jazyce Visual Basic) k odebrání všech položek v blokující kolekci. |
| Postupy: Použití polí blokujících kolekcí v kanálu | Popisuje, jak používat více blokujících kolekcí současně k implementaci potrubí. |
| Postupy: Vytvoření fondu objektů pomocí ConcurrentBagu | Ukazuje, jak použít souběžnou tašku ke zlepšení výkonu ve scénářích, kdy můžete místo neustálého vytváření nových objektů opakovaně používat objekty. |