Spravovaný fond vláken
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šší v rozhraní Framework 4 a novější, protože můžete vytvářet Task a Task<TResult> objekty, které provádějí asynchronní úlohy ve vláknech 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 vlákna na pozadí . 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 ve vláknech fondu vláken
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 fondu vláken
Počet operací, které lze zařadit do fronty do 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.
Minimum 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 vláken 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žití dostupných prostředků, zatímco příliš mnoho vláken může zvýšit kolize prostředků.
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 použít knihovnu TPL (Task Parallel Library). Ve výchozím nastavení typy TPL, jako jsou Task vlákna fondu vláken a Task<TResult> používají 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, které souvisejí s operací čekání pomocí ThreadPool.RegisterWaitForSingleObject metody a předáním System.Threading.WaitHandle metody, která při signálu nebo vypršení časového limitu volá metodu reprezentovanou delegátem System.Threading.WaitOrTimerCallback . Vlákna fondu vláken se používají k vyvolání metod zpětného volání.
V příkladech zkontrolujte 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 všechny kontroly zabezpečení prováděné během provádění ú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:
- Vyžadujete vlákno popředí.
- Vyžadujete, aby vlákno měla určitou prioritu.
- Máte úlohy, které způsobí, že vlákno bude blokovat po dlouhou dobu. Fond vláken má maximální počet vláken, takže velký počet vláken fondu blokovaných vláken 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.