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.
Třída System.Threading.ThreadPool poskytuje vaší aplikaci fond pracovních vláken spravovaných systémem, takže se můžete soustředit na úlohy aplikací, nikoli na správu vláken. Pokud máte krátké úlohy, které vyžadují zpracování na pozadí, je fond spravovaných vláken snadný způsob, jak využít více vláken. Použití fondu vláken je výrazně jednodušší ve Frameworku 4 a novějších verzích, protože můžete vytvářet Task a Task<TResult> objekty, které provádějí asynchronní úlohy ve fondu vláken.
.NET používá vlákna fondu vláken pro mnoho účelů, včetně operací TPL (Task Parallel Library), asynchronního dokončování vstupně-výstupních operací, zpětného volání časovače , registrovaných operací čekání, asynchronních volání metod pomocí delegátů a System.Net připojení soketů.
Charakteristiky fondu vláken
Vlákna fondu vláken jsou pozadí vlákna. Každé vlákno používá výchozí velikost zásobníku, spouští se s výchozí prioritou a nachází se v apartmánu s více vlákny. Jakmile vlákno ve fondu vláken dokončí svou úlohu, vrátí se do fronty čekajících vláken. Od této chvíle je možné ho znovu použít. Opakované použití umožňuje aplikacím vyhnout se nákladům na vytvoření nového vlákna pro každou úlohu.
Pro každý proces existuje pouze jeden fond vláken.
Výjimky v vláknech vláknového fondu
Neošetřené výjimky ve vláknech fondu vláken proces ukončí. Toto pravidlo má tři výjimky:
- Ve vlákně fondu vláken je vyvolána odpověď System.Threading.ThreadAbortException , protože Thread.Abort byla volána.
- Je System.AppDomainUnloadedException vyvolána ve vlákně fondu vláken, protože doména aplikace je uvolněna.
- Modul CLR (Common Language Runtime) nebo hostitelský proces ukončí vlákno.
Další informace naleznete v tématu Výjimky ve spravovaných vláknech.
Maximální počet vláken v poolu
Počet operací, které lze zařadit do fronty fondu vláken, je omezen pouze dostupnou pamětí. Fond vláken však omezuje počet vláken, která mohou být aktivní v procesu současně. Pokud jsou všechna vlákna fondu vláken zaneprázdněná, další pracovní položky se zařadí do fronty, dokud nebudou k dispozici vlákna, která je spustí. Výchozí velikost fondu vláken pro proces závisí na několika faktorech, jako je například velikost virtuálního adresního prostoru. Proces může volat metodu ThreadPool.GetMaxThreads k určení počtu vláken.
Maximální počet vláken můžete řídit pomocí ThreadPool.GetMaxThreads metod a ThreadPool.SetMaxThreads metod.
Poznámka:
Kód, který je hostitelem modulu CLR (Common Language Runtime), může nastavit velikost pomocí ICorThreadpool::CorSetMaxThreads metody.
Minima fondu vláken
Fond vláken poskytuje nová pracovní vlákna nebo vlákna dokončení vstupně-výstupních operací na vyžádání, dokud nedosáhne zadaného minimálního počtu pro každou kategorii. Tuto metodu ThreadPool.GetMinThreads můžete použít k získání těchto minimálních hodnot.
Poznámka:
Pokud je poptávka nízká, skutečný počet vláken fondu může spadat pod minimální hodnoty.
Po dosažení minimálního počtu vláken může fond vláken vytvořit další vlákna nebo počkat na dokončení některých úloh. Fond vláken vytváří a zničí pracovní vlákna za účelem optimalizace propustnosti, která je definována jako počet úkolů, které se dokončí za jednotku času. Příliš málo vláken nemusí optimálně využívat dostupné prostředky, zatímco příliš mnoho vláken může zvýšit soutěžení o prostředky.
Upozornění
Metodu ThreadPool.SetMinThreads můžete použít ke zvýšení minimálního počtu nečinných vláken. Zbytečně ale zvýšení těchto hodnot může způsobit problémy s výkonem. Pokud je současně spuštěno příliš mnoho úkolů, může se zdát, že všechny úkoly jsou pomalé. Ve většině případů bude fond vláken fungovat lépe s vlastním algoritmem pro přidělování vláken.
Použití fondu vláken
Nejjednodušší způsob, jak použít fond vláken, je využít Task Parallel Library (TPL). Ve výchozím nastavení typy TPL, jako jsou Task a Task<TResult>, používají vlákna fondu vláken ke spouštění úloh.
Fond vláken můžete použít také voláním ThreadPool.QueueUserWorkItem ze spravovaného kódu (nebo ICorThreadpool::CorQueueUserWorkItem z nespravovaného kódu) a předáním delegáta System.Threading.WaitCallback představující metodu, která provádí úlohu.
Dalším způsobem, jak použít fond vláken, je zařadit pracovní položky související s operací čekání prostřednictvím metody ThreadPool.RegisterWaitForSingleObject tím, že předáte parametr System.Threading.WaitHandle, který při přijetí signálu nebo vypršení časového limitu vyvolá metodu reprezentovanou delegátem System.Threading.WaitOrTimerCallback. Vlákna fondu vláken se používají k vyvolání metod zpětného volání.
Pro příklady se podívejte na odkazované stránky rozhraní API.
Přeskočení kontrol zabezpečení
Fond vláken také poskytuje ThreadPool.UnsafeQueueUserWorkItem metody a ThreadPool.UnsafeRegisterWaitForSingleObject metody. Tyto metody používejte pouze v případě, že jste si jisti, že zásobník volajícího je irelevantní pro jakékoliv kontroly zabezpečení prováděné během realizace úlohy zařazené do fronty. ThreadPool.QueueUserWorkItem a ThreadPool.RegisterWaitForSingleObject zachyťte zásobník volajícího, který se sloučí do zásobníku vlákna fondu vláken, když vlákno začne spouštět úlohu. Pokud je vyžadována kontrola zabezpečení, je nutné zkontrolovat celý zásobník. I když kontrola poskytuje bezpečnost, má také náklady na výkon.
Kdy nepoužívat vlákna fondu vláken
Existuje několik scénářů, ve kterých je vhodné vytvářet a spravovat vlastní vlákna místo použití vláken fondu vláken:
- Potřebujete přední vlákno.
- Vyžadujete, aby vlákno měla určitou prioritu.
- Máte úlohy, které způsobí, že se vlákno bude po dlouhou dobu blokovat. Vlákénkový fond má maximální počet vláken, takže velký počet blokovaných vláken ve vlákénkovém fondu může zabránit spuštění úloh.
- Potřebujete umístit vlákna do jednovláknového bytu. Všechna ThreadPool vlákna jsou v vícevláknovém bytě.
- Potřebujete mít stabilní identitu spojenou s vláknem nebo vyhradit vlákno k úloze.