Sdílet prostřednictvím


Kolekce pro bezpečný přístup z více vláken

.NET Framework 4 zavádí obor názvů System.Collections.Concurrent, který zahrnuje několik tříd kolekcí, které jsou určeny pro bezpečný přístup z více vláken i škálovatelné. Více vláken může bezpečně a účinně přidat nebo odebrat položky z těchto kolekcí bez nutnosti další synchronizace v kódu uživatele. Při psaní nového kódu použijte třídy souběžných kolekcí, pokud bude do kolekce souběžně zapisováno více vlákny. Pokud ze sdílené kolekce pouze čtete, můžete použít třídy v oboru názvů System.Collections.Generic. Doporučujeme nepoužívat třídy kolekcí verze 1.0, pokud není vyžadováno zaměření na rozhraní .NET Framework 1.1 nebo na starší modul runtime.

Synchronizace vláken v kolekcích rozhraní .NET Framework 1.0 a 2.0

Kolekce zavedené v rozhraní .NET Framework 1.0 se nacházejí v oboru názvů System.Collections. Tyto kolekce, které zahrnují běžně používaný ArrayList a Hashtable, poskytují některé prvky bezpečného přístupu z více vláken prostřednictvím vlastnosti Synchronized, která vrátí obal kolem kolekce pro bezpečný přístup z více vláken. Obal funguje tak, že u každé operace přidání či odebrání uzamyká celou kolekci. Proto musí každé vlákno, které se pokouší získat přístup ke kolekci, čekat až na něj přijde řada a bude moci převzít tento jeden zámek. Takovéto chování není škálovatelné a může způsobit významné snížení výkonu u velkých kolekcí. Navíc daný návrh není zcela chráněn před vznikem sporu. Další informace naleznete v synchronizace v obecné kolekce na webu MSDN.

Třídy kolekcí zavedené v rozhraní .NET Framework 2.0 se nacházejí v oboru názvů System.Collections.Generic. Patří zde List<T>, Dictionary<TKey, TValue> a tak podobně. Tyto třídy, ve srovnání s třídami rozhraní .NET Framework 1.0, poskytují vylepšení typové bezpečnosti a výkonu. Třídy kolekcí rozhraní .NET Framework 2.0 nicméně neposkytují žádnou synchronizaci vláken; uživatelský kód musí poskytnout veškerou synchronizaci při přidávání a odstraňování položek ve více vláknech souběžně.

Doporučujeme třídy souběžných kolekcí v .NET Framework 4, protože nejenže poskytují typovou bezpečnost tříd kolekcí rozhraní .NET Framework 2.0, ale také efektivnější a úplnější bezpečnost přístupu z více vláken než poskytují kolekce .NET Framework 1.0.

Mechanismy uzamčení Fine-Grained a uvolnění zámku

Některé typy souběžných kolekcí používají mechanismy zjednodušené synchronizace, jako například SpinLock, SpinWait, SemaphoreSlim a CountdownEvent, které jsou v .NET Framework 4 nové. Tyto typy synchronizace obvykle používají pro krátkou dobu cyklus zaneprázdnění, než převedou vlákno do opravdového stavu Wait (čekání). Při velmi krátké očekávané době čekání je zaneprázdnění mnohem méně výpočetně náročné než čekání, které zahrnuje nákladný přechod jádra. Pro třídy kolekcí, které používají zaneprázdnění, tato efektivita znamená, že více vláken je schopno přidávat a odebírat položky velmi vysokou rychlostí. Další informace o rozdílech mezi zaneprázdněním a blokováním naleznete v tématech uzamčení a SpinWait.

Třídy ConcurrentQueue<T> a ConcurrentStack<T> nepoužívají žádné uzamčení. Místo toho se pro dosažení bezpečnosti přístupu z více vláken spoléhají na operace Interlocked.

PoznámkaPoznámka

Protože třídy souběžných kolekcí podporují ICollection, poskytují implementace pro vlastnosti IsSynchronized a SyncRoot, i když tyto vlastnosti nejsou relevantní.IsSynchronized vždy vrací false a SyncRoot je vždy null (Nothing v jazyce Visual Basic).

V následující tabulce jsou uvedeny typy kolekcí v oboru názvů System.Collections.Concurrent.

Typ

Popis

BlockingCollection<T>

Poskytuje funkci ohraničování a blokování pro libovolný typ, který implementuje IProducerConsumerCollection<T>. Další informace naleznete v tématu přehled BlockingCollection.

ConcurrentDictionary<TKey, TValue>

Implementace slovníku dvojic klíč–hodnota s bezpečným přístupem z více vláken.

ConcurrentQueue<T>

Implementace fronty FIFO (první dovnitř, první ven) s bezpečným přístupem z více vláken.

ConcurrentStack<T>

Implementace zásobníku LIFO (poslední dovnitř, první ven) s bezpečným přístupem z více vláken.

ConcurrentBag<T>

Implementace neuspořádané kolekce prvků s bezpečným přístupem z více vláken.

IProducerConsumerCollection<T>

Rozhraní, které musí typ implementovat, aby mohl být použit v BlockingCollection.

Příbuzná témata

Title

Popis

přehled BlockingCollection

Popisuje funkce poskytované typem BlockingCollection<T>.

Postupy: Přidávání a odebírání položek z ConcurrentDictionary

Popisuje, jak přidat a odebrat prvky z ConcurrentDictionary<TKey, TValue>

Postupy: Přidat a převzít položky z blokující kolekce jednotlivě

Popisuje, jak přidat a získat položky z blokující kolekce bez použití enumerátoru určeného jen pro čtení.

Postupy: Přidat ohraničovací a blokování funkce třídy kolekce

Popisuje způsob použití jakékoli třídy kolekce jakožto podkladový mechanismus úložiště pro kolekci IProducerConsumerCollection<T>.

Postupy: Odebrat položky z blokující kolekce pomocí ForEach

Popisuje způsob použití foreach, (For Each v jazyce Visual Basic) pro odebrání všech položek z blokující kolekce.

Postupy: Použítí polí blokujících kolekcí v kanálu

Popisuje způsob použití většího počtu blokujících kolekcí současně pro implementování kanálu.

Postupy: Vytvoření fondu objektu pomocí ConcurrentBag

Ukazuje, jak použít souběžných vaku zlepšení výkonu v situacích, kde můžete znovu použít neustále vytvářet nové objekty.

Odkaz

System.Collections.Concurrent