ThreadPool Klas
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Biedt een groep threads die kunnen worden gebruikt om taken uit te voeren, werkitems te posten, asynchrone I/O te verwerken, te wachten namens andere threads en timers te verwerken.
public ref class ThreadPool sealed
public ref class ThreadPool abstract sealed
public sealed class ThreadPool
public static class ThreadPool
type ThreadPool = class
Public NotInheritable Class ThreadPool
Public Class ThreadPool
- Overname
-
ThreadPool
Voorbeelden
In het volgende voorbeeld wordt in de hoofdtoepassingsthread een methode in de wachtrij geplaatst die moet ThreadProc worden uitgevoerd op een thread met threads van een thread, wordt één seconde geslapen en vervolgens afgesloten. Met de ThreadProc methode wordt gewoon een bericht weergegeven.
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.
Als u de aanroep van de Thread.Sleep methode als commentaar geeft, wordt de hoofdthread afgesloten voordat de methode wordt uitgevoerd op de thread van de threadgroep. De threadgroep maakt gebruik van achtergrondthreads, waardoor de toepassing niet actief blijft als alle voorgrondthreads zijn beëindigd. (Dit is een eenvoudig voorbeeld van een racevoorwaarde.)
Opmerkingen
Veel toepassingen maken threads die veel tijd doorbrengen in de slaapstand en wachten tot er een gebeurtenis plaatsvindt. Andere threads kunnen een slaaptoestand opgeven die alleen periodiek wordt geactiveerd om te peilen naar informatie over de wijzigings- of updatestatus. Met de threadgroep kunt u threads efficiënter gebruiken door uw toepassing een groep werkthreads te bieden die worden beheerd door het systeem. Voorbeelden van bewerkingen die threadgroepthreads gebruiken, zijn onder andere:
Wanneer u een Task of Task<TResult> object maakt om een bepaalde taak asynchroon uit te voeren, wordt de taak standaard gepland voor uitvoering op een threadgroepthread.
Asynchrone timers gebruiken de threadpool. Threadpoolthreads voeren callbacks uit van de System.Threading.Timer klasse en genereren gebeurtenissen uit de System.Timers.Timer klasse.
Wanneer u geregistreerde wachtgrepen gebruikt, bewaakt een systeemthread de status van de wachtgrepen. Wanneer een wachtbewerking is voltooid, voert een werkrolthread uit de threadgroep de bijbehorende callback-functie uit.
Wanneer u de methode aanroept om een methode in de QueueUserWorkItem wachtrij te plaatsen voor uitvoering op een threadgroepthread. U doet dit door de methode door te geven aan een WaitCallback gemachtigde. De gedelegeerde heeft de handtekening
void WaitCallback(Object state)Sub WaitCallback(state As Object)waar
stateis een object dat gegevens bevat die door de gemachtigde moeten worden gebruikt. De werkelijke gegevens kunnen worden doorgegeven aan de gemachtigde door de methode aan te QueueUserWorkItem(WaitCallback, Object) roepen.
Note
De threads in de beheerde threadgroep zijn achtergrondthreads. Dat wil gezegd, hun IsBackground eigenschappen zijn true. Dit betekent dat een ThreadPool thread geen toepassing blijft uitvoeren nadat alle voorgrondthreads zijn afgesloten.
Important
Wanneer de threadgroep een thread opnieuw gebruikt, worden de gegevens in de lokale opslag van threads of in velden die zijn gemarkeerd met het ThreadStaticAttribute kenmerk, niet gewist. Wanneer een methode de lokale opslag van threads of velden onderzoekt die zijn gemarkeerd met het ThreadStaticAttribute kenmerk, kunnen de waarden die worden gevonden, worden overgelaten van een eerder gebruik van de thread van de threadgroep.
U kunt ook werkitems in de wachtrij plaatsen die niet zijn gerelateerd aan een wachtbewerking naar de threadgroep. Als u wilt aanvragen dat een werkitem wordt verwerkt door een thread in de threadgroep, roept u de QueueUserWorkItem methode aan. Deze methode gebruikt als parameter een verwijzing naar de methode of gemachtigde die wordt aangeroepen door de thread die is geselecteerd in de threadgroep. Er is geen manier om een werkitem te annuleren nadat het in de wachtrij is geplaatst.
Timertimers en geregistreerde wachtbewerkingen maken ook gebruik van de threadpool. Hun callback-functies worden in de wachtrij geplaatst in de threadpool.
Er is één threadpool per proces. Vanaf het .NET Framework 4 is de standaardgrootte van de threadgroep voor een proces afhankelijk van verschillende factoren, zoals de grootte van de virtuele adresruimte. Een proces kan de GetMaxThreads methode aanroepen om het aantal threads te bepalen. Het aantal threads in de threadgroep kan worden gewijzigd met behulp van de SetMaxThreads methode. Elke thread maakt gebruik van de standaardstackgrootte en wordt uitgevoerd op de standaardprioriteit.
Note
Niet-beheerde code die als host fungeert voor het .NET Framework, kan de grootte van de threadpool wijzigen met behulp van de functie CorSetMaxThreads, gedefinieerd in het bestand mscoree.h.
De threadgroep biedt nieuwe werkthreads of I/O-voltooiingsthreads op aanvraag totdat het maximum voor elke categorie is bereikt. Wanneer een maximum is bereikt, kan de threadgroep extra threads in die categorie maken of wachten totdat bepaalde taken zijn voltooid. Vanaf het .NET Framework 4 maakt en vernietigt de threadgroep werkthreads om de doorvoer te optimaliseren. Dit wordt gedefinieerd als het aantal taken dat per tijdseenheid wordt voltooid. Te weinig threads maken mogelijk niet optimaal gebruik van beschikbare resources, terwijl er te veel threads kunnen leiden tot conflicten tussen resources.
Note
Wanneer de vraag laag is, kan het werkelijke aantal threadpool-threads onder de minimaal vereiste waarden vallen.
U kunt de GetMinThreads methode gebruiken om deze minimumwaarden te verkrijgen.
Caution
U kunt de SetMinThreads methode gebruiken om het minimum aantal threads te verhogen. Het onnodig verhogen van deze waarden kan echter prestatieproblemen veroorzaken. Als er te veel taken tegelijk beginnen, lijken ze allemaal traag te zijn. In de meeste gevallen presteert de threadgroep beter met een eigen algoritme voor het toewijzen van threads.
Methoden
| Name | Description |
|---|---|
| BindHandle(IntPtr) |
Verouderd.
Verbindt een besturingssysteemgreep aan de ThreadPool. |
| BindHandle(SafeHandle) |
Verbindt een besturingssysteemgreep aan de ThreadPool. |
| GetAvailableThreads(Int32, Int32) |
Hiermee haalt u het verschil op tussen het maximum aantal threadgroepthreads dat door de GetMaxThreads(Int32, Int32) methode wordt geretourneerd en het aantal dat momenteel actief is. |
| GetMaxThreads(Int32, Int32) |
Hiermee haalt u het aantal aanvragen op voor de threadgroep die gelijktijdig actief kan zijn. Alle aanvragen boven dat nummer blijven in de wachtrij staan totdat threads beschikbaar komen. |
| GetMinThreads(Int32, Int32) |
Hiermee haalt u het minimale aantal threads op dat de threadgroep op aanvraag maakt, omdat er nieuwe aanvragen worden gedaan, voordat u overschakelt naar een algoritme voor het beheren van het maken en vernietigen van threads. |
| QueueUserWorkItem(WaitCallback, Object) |
Hiermee wordt een methode voor uitvoering in de wachtrij geplaatst en wordt een object opgegeven dat gegevens bevat die door de methode moeten worden gebruikt. De methode wordt uitgevoerd wanneer een threadpool-thread beschikbaar komt. |
| QueueUserWorkItem(WaitCallback) |
Een methode voor uitvoering in de wachtrij plaatsen. De methode wordt uitgevoerd wanneer een threadpool-thread beschikbaar komt. |
| QueueUserWorkItem<TState>(Action<TState>, TState, Boolean) |
Hiermee wordt een methode in de wachtrij geplaatst die is opgegeven door een Action<T> gemachtigde voor uitvoering en worden gegevens geleverd die door de methode moeten worden gebruikt. De methode wordt uitgevoerd wanneer een threadpool-thread beschikbaar komt. |
| RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) |
Registreert een gemachtigde om te wachten op een WaitHandle, waarbij een 32-bits geheel getal wordt opgegeven voor de time-out in milliseconden. |
| RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) |
Registreert een gemachtigde om te wachten op een WaitHandle, waarbij een 64-bits geheel getal wordt opgegeven voor de time-out in milliseconden. |
| RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) |
Registreert een gemachtigde om te wachten op een WaitHandle, waarbij een TimeSpan waarde voor de time-out wordt opgegeven. |
| RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) |
Registreert een gemachtigde om te wachten op een WaitHandle, waarbij een 32-bits geheel getal zonder teken wordt opgegeven voor de time-out in milliseconden. |
| SetMaxThreads(Int32, Int32) |
Hiermee stelt u het aantal aanvragen in op de threadgroep die gelijktijdig actief kan zijn. Alle aanvragen boven dat nummer blijven in de wachtrij staan totdat threads beschikbaar komen. |
| SetMinThreads(Int32, Int32) |
Hiermee stelt u het minimale aantal threads in dat de threadgroep op aanvraag maakt, terwijl er nieuwe aanvragen worden gedaan, voordat u overschakelt naar een algoritme voor het beheren van het maken en vernietigen van threads. |
| UnsafeQueueNativeOverlapped(NativeOverlapped*) |
Zet een overlappende I/O-bewerking in de wachtrij voor uitvoering. |
| UnsafeQueueUserWorkItem(WaitCallback, Object) |
Hiermee wordt de opgegeven gemachtigde in de threadgroep in de wachtrij geplaatst, maar wordt de aanroepende stack niet doorgegeven aan de werkrolthread. |
| UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) |
Registreert een gemachtigde om te wachten op een WaitHandle, met behulp van een 32-bits geheel getal voor de time-out in milliseconden. Met deze methode wordt de aanroepende stack niet doorgegeven aan de werkrolthread. |
| UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) |
Registreert een gemachtigde om te wachten op een WaitHandle, waarbij een 64-bits geheel getal wordt opgegeven voor de time-out in milliseconden. Met deze methode wordt de aanroepende stack niet doorgegeven aan de werkrolthread. |
| UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) |
Registreert een gemachtigde om te wachten op een WaitHandle, waarbij een TimeSpan waarde voor de time-out wordt opgegeven. Met deze methode wordt de aanroepende stack niet doorgegeven aan de werkrolthread. |
| UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) |
Registreert een gemachtigde om te wachten op een WaitHandle, waarbij een 32-bits geheel getal zonder teken wordt opgegeven voor de time-out in milliseconden. Met deze methode wordt de aanroepende stack niet doorgegeven aan de werkrolthread. |
Van toepassing op
Veiligheid thread
Dit type is thread veilig.