ThreadPool Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Poskytuje fond vláken, která lze použít ke spouštění úloh, po pracovních položkách, zpracování asynchronních vstupně-výstupních operací, čekání jménem jiných vláken a časovačů procesů.
public ref class ThreadPool abstract sealed
public ref class ThreadPool sealed
public static class ThreadPool
public sealed class ThreadPool
type ThreadPool = class
Public Class ThreadPool
Public NotInheritable Class ThreadPool
- Dědičnost
-
ThreadPool
Příklady
V následujícím příkladu hlavní vlákno aplikace zařadí do fronty metodu pojmenovanou ThreadProc ke spuštění ve vlákně fondu vláken, přejde do režimu spánku za jednu sekundu a pak se ukončí. Metoda ThreadProc jednoduše zobrazí zprávu.
using System;
using System.Threading;
public class Example
{
public static void Main()
{
// Queue the task.
ThreadPool.QueueUserWorkItem(ThreadProc);
Console.WriteLine("Main thread does some work, then sleeps.");
Thread.Sleep(1000);
Console.WriteLine("Main thread exits.");
}
// This thread procedure performs the task.
static void ThreadProc(Object stateInfo)
{
// No state object was passed to QueueUserWorkItem, so stateInfo is null.
Console.WriteLine("Hello from the thread pool.");
}
}
// The example displays output like the following:
// Main thread does some work, then sleeps.
// Hello from the thread pool.
// Main thread exits.
Imports System.Threading
Public Module Example
Public Sub Main()
' Queue the work for execution.
ThreadPool.QueueUserWorkItem(AddressOf ThreadProc)
Console.WriteLine("Main thread does some work, then sleeps.")
Thread.Sleep(1000)
Console.WriteLine("Main thread exits.")
End Sub
' This thread procedure performs the task.
Sub ThreadProc(stateInfo As Object)
' No state object was passed to QueueUserWorkItem, so stateInfo is null.
Console.WriteLine("Hello from the thread pool.")
End Sub
End Module
' The example displays output like the following:
' Main thread does some work, then sleeps.
' Hello from the thread pool.
' Main thread exits.
Pokud zakomentujete volání Thread.Sleep metody, hlavní vlákno se ukončí před spuštěním metody ve vlákně fondu vláken. Fond vláken používá vlákna na pozadí, která nechovají aplikaci spuštěnou, pokud byla ukončena všechna vlákna popředí. (Toto je jednoduchý příklad podmínky časování.)
Poznámky
Mnoho aplikací vytváří vlákna, která tráví velkou část času ve stavu spánku a čekají na výskyt události. Ostatní vlákna můžou vstoupit do stavu spánku, aby se pravidelně probuzovaly, aby se dotazovaly na informace o stavu změny nebo aktualizace. Fond vláken umožňuje efektivněji používat vlákna tím, že aplikaci poskytne fond pracovních vláken spravovaných systémem. Mezi příklady operací, které používají vlákna fondu vláken, patří:
Když vytvoříte Task nebo Task<TResult> objekt, který provede některé úlohy asynchronně, ve výchozím nastavení je úkol naplánován tak, aby běžel ve vlákně fondu vláken.
Asynchronní časovače používají fond vláken. Vlákna fondu vláken spouští zpětná volání z System.Threading.Timer třídy a vyvolává události z System.Timers.Timer třídy.
Při použití registrovaných popisovačů čekání sleduje systémové vlákno stav popisovačů čekání. Po dokončení operace čekání spustí pracovní vlákno z fondu vláken odpovídající funkci zpětného volání.
Když zavoláte metodu QueueUserWorkItem , která zařadí metodu do fronty pro spuštění ve vlákně fondu vláken. Provedete to předáním metody delegáta WaitCallback . Delegát má podpis.
void WaitCallback(Object state)Sub WaitCallback(state As Object)kde
stateje objekt, který obsahuje data, která má delegát používat. Skutečná data lze delegátu předat voláním QueueUserWorkItem(WaitCallback, Object) metody.
Note
Vlákna ve spravovaném fondu vláken jsou vlákna na pozadí. To znamená, že jejich IsBackground vlastnosti jsou true. To znamená, že ThreadPool vlákno nebude udržovat aplikaci spuštěnou po ukončení všech vláken popředí.
Important
Pokud fond vláken znovu použije vlákno, vymaže data v místním úložišti vlákna ani v polích označených atributem ThreadStaticAttribute . Proto když metoda zkoumá místní úložiště vlákna nebo pole označená atributem ThreadStaticAttribute , mohou být nalezené hodnoty ponechány z dřívějšího použití vlákna fondu vláken.
Pracovní položky, které nesouvisejí s operací čekání na fond vláken, můžete také zařadit do fronty. Chcete-li požádat o zpracování pracovní položky vláknem ve fondu vláken, zavolejte metodu QueueUserWorkItem . Tato metoda přebírá jako parametr odkaz na metodu nebo delegáta, který bude volán vláknem vybraným z fondu vláken. Po zařadíte pracovní položku do fronty, neexistuje způsob, jak pracovní položku zrušit.
Časovače fronty a registrované operace čekání také používají fond vláken. Jejich funkce zpětného volání jsou zařazeny do fronty do fondu vláken.
Pro každý proces existuje jeden fond vláken. Počínaje rozhraním .NET Framework 4 závisí výchozí velikost fondu vláken pro proces na několika faktorech, jako je například velikost virtuálního adresního prostoru. Proces může volat metodu GetMaxThreads k určení počtu vláken. Počet vláken ve fondu vláken lze změnit pomocí SetMaxThreads metody. Každé vlákno používá výchozí velikost zásobníku a spouští se s výchozí prioritou.
Note
Nespravovaný kód, který hostuje .NET Framework, může změnit velikost fondu vláken pomocí funkce CorSetMaxThreads definované v souboru mscoree.h.
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 maximálního limitu pro každou kategorii. Po dosažení maximálního počtu může fond vláken vytvořit další vlákna v dané kategorii nebo počkat na dokončení některých úloh. Počínaje rozhraním .NET Framework 4 fond vláken vytváří a zničí pracovní vlákna za účelem optimalizace propustnosti, která je definována jako počet úloh, 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.
Note
Pokud je poptávka nízká, skutečný počet vláken fondu může spadat pod minimální hodnoty.
Tuto metodu GetMinThreads můžete použít k získání těchto minimálních hodnot.
Caution
Metodu SetMinThreads můžete použít ke zvýšení minimálního počtu 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.
Vlastnosti
| Name | Description |
|---|---|
| CompletedWorkItemCount |
Získá počet pracovních položek, které byly dosud zpracovány. |
| PendingWorkItemCount |
Získá počet pracovních položek, které jsou aktuálně zařazeny do fronty ke zpracování. |
| ThreadCount |
Získá počet vláken fondu vláken, které aktuálně existují. |
Metody
| Name | Description |
|---|---|
| BindHandle(IntPtr) |
Zastaralé.
Zastaralé.
Vytvoří vazbu na popisovač operačního systému .ThreadPool |
| BindHandle(SafeHandle) |
Vytvoří vazbu na popisovač operačního systému .ThreadPool |
| GetAvailableThreads(Int32, Int32) |
Načte rozdíl mezi maximálním počtem vláken fondu vláken vrácených metodou a číslem GetMaxThreads(Int32, Int32) , které je aktuálně aktivní. |
| GetMaxThreads(Int32, Int32) |
Načte počet požadavků do fondu vláken, který může být současně aktivní. Všechny požadavky nad tímto číslem zůstanou ve frontě, dokud nebudou k dispozici vlákna fondu vláken. |
| GetMinThreads(Int32, Int32) |
Před přepnutím na algoritmus pro správu vytváření a zničení vlákna načte fond vláken na vyžádání, protože se vytvoří nové požadavky. |
| QueueUserWorkItem(WaitCallback, Object) |
Zařadí do fronty metodu pro spuštění a určuje objekt obsahující data, která má metoda použít. Metoda se spustí, když bude k dispozici vlákno fondu vláken. |
| QueueUserWorkItem(WaitCallback) |
Zařadí metodu spuštění do fronty. Metoda se spustí, když bude k dispozici vlákno fondu vláken. |
| QueueUserWorkItem<TState>(Action<TState>, TState, Boolean) |
Zařadí metodu určenou delegátem Action<T> pro spuštění a poskytuje data, která tato metoda použije. Metoda se spustí, když bude k dispozici vlákno fondu vláken. |
| RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) |
Zaregistruje delegáta, který bude čekat na WaitHandle32bitové celé číslo se znaménkem pro vypršení časového limitu v milisekundách. |
| RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) |
Zaregistruje delegáta, který bude čekat na WaitHandle64bitové celé číslo se znaménkem pro vypršení časového limitu v milisekundách. |
| RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) |
Zaregistruje delegáta, který bude čekat na WaitHandleTimeSpan hodnotu časového limitu. |
| RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) |
Zaregistruje delegáta, který bude čekat na WaitHandle32bitové celé číslo bez znaménka pro časový limit v milisekundách. |
| SetMaxThreads(Int32, Int32) |
Nastaví počet požadavků na fond vláken, který může být současně aktivní. Všechny požadavky nad tímto číslem zůstanou ve frontě, dokud nebudou k dispozici vlákna fondu vláken. |
| SetMinThreads(Int32, Int32) |
Nastaví minimální počet vláken, která fond vláken vytvoří na vyžádání, protože se vytvoří nové požadavky, a teprve potom přejdete na algoritmus pro správu vytváření a zničení vlákna. |
| UnsafeQueueNativeOverlapped(NativeOverlapped*) |
Zařadí do fronty překrývající se vstupně-výstupní operaci pro spuštění. |
| UnsafeQueueUserWorkItem(IThreadPoolWorkItem, Boolean) |
Zařadí zadaný objekt pracovní položky do fondu vláken. |
| UnsafeQueueUserWorkItem(WaitCallback, Object) |
Zařadí zadaný delegát do fondu vláken, ale nešíruje volající zásobník do pracovního vlákna. |
| UnsafeQueueUserWorkItem<TState>(Action<TState>, TState, Boolean) |
Zařadí metodu určenou delegátem Action<T> pro spuštění a určuje objekt obsahující data, která má metoda použít. Metoda se spustí, když bude k dispozici vlákno fondu vláken. |
| UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) |
Zaregistruje delegáta, aby počkal na WaitHandle32bitové celé číslo se znaménkem pro vypršení časového limitu v milisekundách. Tato metoda nešíruje volající zásobník do pracovního vlákna. |
| UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) |
Zaregistruje delegáta, který bude čekat na WaitHandle64bitové celé číslo se znaménkem pro vypršení časového limitu v milisekundách. Tato metoda nešíruje volající zásobník do pracovního vlákna. |
| UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) |
Zaregistruje delegáta, který bude čekat na WaitHandleTimeSpan hodnotu časového limitu. Tato metoda nešíruje volající zásobník do pracovního vlákna. |
| UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) |
Zaregistruje delegáta, který bude čekat na WaitHandle32bitové celé číslo bez znaménka pro časový limit v milisekundách. Tato metoda nešíruje volající zásobník do pracovního vlákna. |
Platí pro
Bezpečný přístup z více vláken
Tento typ je bezpečný pro přístup z více vláken.