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.
.NET poskytuje několik typů, které jsou užitečné v paralelním programování, včetně sady souběžných tříd kolekce, jednoduchých primitiv synchronizace a typů pro opožděnou inicializaci. Tyto typy můžete použít s libovolným kódem vícevláknové aplikace, včetně knihovny Task Parallel Library a PLINQ.
Souběžné třídy kolekce
Třídy kolekcí v oboru názvů System.Collections.Concurrent poskytují operace přidávání a odebírání, které jsou bezpečné vůči vláknům a vyhýbají se zámkům, kdykoli je to možné, a používají jemnozrnné zámky tam, kde jsou zámky nezbytné. Třída kolekce pro souběžný přístup nevyžaduje, aby uživatelský kód při přístupu k položkám používal zámky. Souběžné třídy kolekcí mohou výrazně zlepšit výkon ve srovnání s typy jako System.Collections.ArrayList a System.Collections.Generic.List<T> (s uzamykáním implementovaným uživatelem) ve scénářích, kdy více vláken přidává a odebírá položky z kolekce.
Následující tabulka uvádí třídy souběžných kolekcí:
Typ | Popis |
---|---|
System.Collections.Concurrent.BlockingCollection<T> | Poskytuje možnosti blokování a ohraničování pro kolekce bezpečné pro vlákna, které implementují System.Collections.Concurrent.IProducerConsumerCollection<T>. Vlákna producenta blokují, pokud nejsou k dispozici žádné sloty nebo pokud je kolekce plná. Konzumentská vlákna se blokují, pokud je kolekce prázdná. Tento typ také podporuje neblokující přístup spotřebitelů a výrobců. BlockingCollection<T> lze použít jako základní třídu nebo záložní úložiště k zajištění blokování a ohraničování pro všechny třídy kolekce, které podporují IEnumerable<T>. |
System.Collections.Concurrent.ConcurrentBag<T> | Implementace vláknově bezpečného zásobníku, která umožňuje škálovatelné operace pro přidání a získání. |
System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> | Souběžný a škálovatelný typ slovníku. |
System.Collections.Concurrent.ConcurrentQueue<T> | Souběžná a škálovatelná fronta FIFO. |
System.Collections.Concurrent.ConcurrentStack<T> | Souběžný a škálovatelný zásobník LIFO. |
Další informace viz Thread-Safe Kolekce.
Primitivy synchronizace
Primitivy synchronizace v System.Threading oboru názvů umožňují jemně odstupňovanou souběžnost a rychlejší výkon tím, že se vyhnete drahým mechanismům uzamčení nalezeným ve starším vícevláknovém kódu.
Následující tabulka uvádí typy synchronizace:
Typ | Popis |
---|---|
System.Threading.Barrier | Umožňuje paralelní práci s algoritmem několika vlákny tím, že poskytne bod, ve kterém může každý úkol signalizovat jeho příchod a pak blokovat, dokud některé nebo všechny úkoly nedorazí. Další informace naleznete v tématu Barrier. |
System.Threading.CountdownEvent | Zjednodušuje scénáře větvení a spojování tím, že poskytuje snadný mechanismus pro synchronizaci. Další informace naleznete v tématu CountdownEvent. |
System.Threading.ManualResetEventSlim | Synchronizační primitivum podobné System.Threading.ManualResetEvent. ManualResetEventSlim je lehčí, ale lze ji použít pouze pro komunikaci uvnitř procesu. |
System.Threading.SemaphoreSlim | Primitivní synchronizace, která omezuje počet vláken, která můžou souběžně přistupovat k prostředku nebo fondu prostředků. Další informace naleznete v tématu Semaphore a SemaphoreSlim. |
System.Threading.SpinLock | Primitiva vzájemného vyloučení, která způsobí, že vlákno, které se pokouší získat zámek, čeká ve smyčce nebo spinu, po určitou dobu před tím, než uvolní svůj časový kvantum. Ve scénářích, ve kterých se očekává, že čekání na zámek bude krátké, SpinLock nabízí lepší výkon než jiné formy uzamčení. Další informace naleznete v tématu SpinLock. |
System.Threading.SpinWait | Malý, lehký typ, který se bude otáčet po určitou dobu a nakonec dá vlákno do stavu čekání, pokud je překročen počet otáček. Další informace naleznete v tématu SpinWait. |
Další informace najdete tady:
Lenošné inicializační třídy
Při opožděné inicializaci není paměť objektu přidělena, dokud nebude potřeba. Opožděné inicializace může zlepšit výkon rozložením přidělení objektů rovnoměrně po celou dobu životnosti programu. Opožděné inicializace pro libovolný vlastní typ můžete povolit zabalením typu Lazy<T>.
Následující tabulka uvádí typy opožděné inicializace:
Typ | Popis |
---|---|
System.Lazy<T> | Poskytuje odlehčenou, vláknově bezpečnou, línou inicializaci. |
System.Threading.ThreadLocal<T> | Poskytuje líně inicializovanou hodnotu pro každé vlákno, kdy každé vlákno líně vyvolává inicializační funkci. |
System.Threading.LazyInitializer | Poskytuje statické metody, které zamezí nutnosti přidělit vyhrazenou instanci s opožděnou inicializací. Místo toho používají odkazy k zajištění inicializace cílů při přístupu. |
Další informace naleznete v tématu Opožděná inicializace.
Agregační výjimky
Typ System.AggregateException lze použít k zachycení více výjimek, které jsou vyvolány souběžně v samostatných vláknech, a vrátit je do spojovacího vlákna jako jedinou výjimku. Typy System.Threading.Tasks.Task a System.Threading.Tasks.Parallel a PLINQ používají AggregateException rozsáhle pro tento účel. Další informace naleznete v tématu Zpracování výjimek a postupy: Zpracování výjimek v plINQ dotazu.