ThreadPool Třída

Definice

Poskytuje fond vláken, které lze použít ke spouštění úkolů, 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 frontu metodu s názvem ThreadProc provést ve vlákně fondu vláken, přejde do režimu spánku na jednu sekundu a poté se ukončí. Metoda ThreadProc jednoduše zobrazí zprávu.

using namespace System;
using namespace System::Threading;

ref class Example
{
public:

   // This thread procedure performs the task.
   static void ThreadProc(Object^ stateInfo)
   {
      
      // No state object was passed to QueueUserWorkItem, so stateInfo is 0.
      Console::WriteLine( "Hello from the thread pool." );
   }
};

int main()
{
   // Queue the task.
   ThreadPool::QueueUserWorkItem(gcnew WaitCallback(Example::ThreadProc));

   Console::WriteLine("Main thread does some work, then sleeps.");
   
   Thread::Sleep(1000);
   Console::WriteLine("Main thread exits.");
   return 0;
}
// The example displays output like the following:
//       Main thread does some work, then sleeps.
//       Hello from the thread pool.
//       Main thread exits.
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á nezachovají aplikaci spuštěnou, pokud byla ukončena všechna vlákna na popředí. (Toto je jednoduchý příklad konfliktu časování.)

Poznámky

Mnoho aplikací vytváří vlákna, která tráví spoustu času v režimu spánku a čekají na výskyt události. Jiná vlákna můžou přejít do režimu spánku, aby se pravidelně probouzela a dotazovala se na informace o stavu změny nebo aktualizace. Fond vláken umožňuje efektivněji používat vlákna tím, že vaší aplikaci poskytuje fond pracovních vláken spravovaných systémem. Příklady operací, které používají vlákna fondu vláken:

  • Když vytvoříte Task objekt nebo Task<TResult> k provedení některé úlohy asynchronně, ve výchozím nastavení je úloha naplánována tak, aby běžela ve vlákně fondu vláken.

  • Asynchronní časovače používají fond vláken. Vlákna fondu vláken spouštějí zpětná volání z System.Threading.Timer třídy a vyvolávají události z System.Timers.Timer třídy .

  • Při použití registrovaných popisovačů čekání systémové vlákno monitoruje stav obslužných rutin čekání. Po dokončení operace čekání pracovní vlákno z fondu vláken spustí odpovídající funkci zpětného volání.

  • Při volání QueueUserWorkItem metody zařadit 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 state je objekt, který obsahuje data, která má delegát použít. Skutečná data lze předat delegátu voláním QueueUserWorkItem(WaitCallback, Object) metody .

Poznámka

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 nezachová aplikaci spuštěnou po ukončení všech vláken na popředí.

Důležité

Když fond vláken znovu použije vlákno, nevymaže data v místním úložišti vlákna nebo v polích označených atributem ThreadStaticAttribute . Proto když metoda kontroluje místní úložiště vlákna nebo pole, která jsou označena atributem ThreadStaticAttribute , mohou být hodnoty, které najde, zbyly z dřívějšího použití vlákna fondu vláken.

Pracovní položky, které nesouvisejí s operací čekání, můžete také zařadit do fronty do fondu vláken. Pokud chcete požádat, aby pracovní položka byla zpracována 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. Neexistuje způsob, jak zrušit pracovní položku, jakmile je zařazena do fronty.

Časovače fronty časovače 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, například na velikosti 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.

Poznámka

Nespravovaný kód, který je hostitelem rozhraní .NET Framework, může změnit velikost fondu vláken pomocí CorSetMaxThreads funkce definované v souboru mscoree.h.

Fond vláken poskytuje nová pracovní vlákna nebo vlákna dokončování vstupně-výstupních operací na vyžádání, dokud nedosáhne maximální hodnoty pro každou kategorii. Při dosažení maxima 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 ničí 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 kolizí prostředků.

Poznámka

Pokud je poptávka nízká, skutečný počet vláken fondu vláken může klesnout pod minimální hodnoty.

K získání těchto minimálních hodnot můžete použít metodu GetMinThreads .

Upozornění

Můžete použít metodu SetMinThreads ke zvýšení minimálního počtu vláken. Zbytečné zvýšení těchto hodnot ale může způsobit problémy s výkonem. Pokud se najednou spustí příliš mnoho úkolů, může se zdát, že jsou všechny 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

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

BindHandle(IntPtr)
Zastaralé.
Zastaralé.

Vytvoří vazbu popisovače operačního systému na .ThreadPool

BindHandle(SafeHandle)

Vytvoří vazbu popisovače operačního systému na .ThreadPool

GetAvailableThreads(Int32, Int32)

Načte rozdíl mezi maximálním počtem vláken fondu vláken vrácených metodou GetMaxThreads(Int32, Int32) a počtem aktuálně aktivních.

GetMaxThreads(Int32, Int32)

Načte počet požadavků na fond vláken, které mohou 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)

Načte minimální počet vláken vytvořených fondem vláken na vyžádání při vytváření nových požadavků před přepnutím na algoritmus pro správu vytváření a zničení vlákna.

QueueUserWorkItem(WaitCallback)

Zatáčí metodu pro spuštění do fronty. Metoda se spustí, když je k dispozici vlákno fondu vláken.

QueueUserWorkItem(WaitCallback, Object)

Zatáčí metodu pro provedení do fronty a určuje objekt obsahující data, která má metoda použít. Metoda se spustí, když je k dispozici vlákno fondu vláken.

QueueUserWorkItem<TState>(Action<TState>, TState, Boolean)

Zatáčí metodu určenou delegátem Action<T> ke spuštění do fronty a poskytuje data, která má metoda použít. Metoda se spustí, když je k dispozici vlákno fondu vláken.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)

Zaregistruje delegáta, který bude čekat na WaitHandle, a určí 32bitové celé číslo se znaménkem pro časový limit v milisekundách.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)

Zaregistruje delegáta pro čekání WaitHandlena , a určí 64bitové celé číslo se znaménkem pro časový limit v milisekundách.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)

Zaregistruje delegáta, který bude čekat na WaitHandlea zadá TimeSpan hodnotu časového limitu.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)

Zaregistruje delegáta pro čekání na WaitHandle, a určí 32bitové 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ůžou 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 vytvořených fondem vláken na vyžádání při vytváření nových požadavků před přepnutím na algoritmus pro správu vytváření a zničení vlákna.

UnsafeQueueNativeOverlapped(NativeOverlapped*)

Za fronty překrývající se vstupně-výstupní operace ke spuštění.

UnsafeQueueUserWorkItem(IThreadPoolWorkItem, Boolean)

Za fronty zadaný objekt pracovní položky do fondu vláken.

UnsafeQueueUserWorkItem(WaitCallback, Object)

Za frontu zadaného delegáta do fondu vláken, ale nerozšíře zásobník volání do pracovního vlákna.

UnsafeQueueUserWorkItem<TState>(Action<TState>, TState, Boolean)

Zatáčí metodu určenou delegátem Action<T> ke spuštění do fronty a určuje objekt obsahující data, která má metoda použít. Metoda se spustí, když je k dispozici vlákno fondu vláken.

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)

Zaregistruje delegáta pro čekání WaitHandlena , pomocí 32bitového celého čísla se znaménkem pro časový limit v milisekundách. Tato metoda nerozšíruje zásobník volání do pracovního vlákna.

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)

Zaregistruje delegáta pro čekání WaitHandlena , a určí 64bitové celé číslo se znaménkem pro časový limit v milisekundách. Tato metoda nerozšíruje zásobník volání do pracovního vlákna.

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)

Zaregistruje delegáta, který bude čekat na WaitHandlea zadá TimeSpan hodnotu časového limitu. Tato metoda nerozšíruje zásobník volání do pracovního vlákna.

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)

Zaregistruje delegáta pro čekání na WaitHandle, a určí 32bitové celé číslo bez znaménka pro časový limit v milisekundách. Tato metoda nerozšíruje zásobník volání 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.

Viz také