Delen via


De beheerde threadpool

De System.Threading.ThreadPool klasse biedt uw toepassing een groep werkthreads die worden beheerd door het systeem, zodat u zich kunt concentreren op toepassingstaken in plaats van threadbeheer. Als u korte taken hebt waarvoor achtergrondverwerking is vereist, is de beheerde threadpool een eenvoudige manier om te profiteren van meerdere threads. Het gebruik van de threadgroep is aanzienlijk eenvoudiger in Framework 4 en hoger, omdat u objecten kunt maken en Task<TResult> objecten kunt maken Task die asynchrone taken uitvoeren op threadpoolthreads.

.NET maakt gebruik van threadpoolthreads voor veel doeleinden, waaronder TPL-bewerkingen (Task Parallel Library), asynchrone I/O-voltooiing, timer callbacks, geregistreerde wachtbewerkingen, asynchrone methodeaanroepen met gemachtigden en System.Net socketverbindingen.

Kenmerken van threadpool

Threads voor threadgroepen zijn achtergrondthreads . Elke thread maakt gebruik van de standaardstackgrootte, wordt uitgevoerd op de standaardprioriteit en bevindt zich in het multithreaded appartement. Zodra een thread in de threadgroep de taak heeft voltooid, wordt deze geretourneerd naar een wachtrij met wachtende threads. Vanaf dit moment kan het opnieuw worden gebruikt. Hierdoor kunnen toepassingen de kosten voor het maken van een nieuwe thread voor elke taak voorkomen.

Er is slechts één threadpool per proces.

Uitzonderingen in threadpoolthreads

Niet-verwerkte uitzonderingen in threadpoolthreads beëindigen het proces. Er zijn drie uitzonderingen op deze regel:

Zie Uitzonderingen in Beheerde threads voor meer informatie.

Maximum aantal thread-poolthreads

Het aantal bewerkingen dat in de wachtrij kan worden geplaatst voor de threadgroep, wordt alleen beperkt door het beschikbare geheugen. De threadgroep beperkt echter het aantal threads dat tegelijkertijd actief kan zijn in het proces. Als alle threadgroepthreads bezet zijn, worden extra werkitems in de wachtrij geplaatst totdat threads om ze uit te voeren beschikbaar zijn. De standaardgrootte van de threadgroep voor een proces is afhankelijk van verschillende factoren, zoals de grootte van de virtuele adresruimte. Een proces kan de ThreadPool.GetMaxThreads methode aanroepen om het aantal threads te bepalen.

U kunt het maximum aantal threads beheren met behulp van de ThreadPool.GetMaxThreads en ThreadPool.SetMaxThreads methoden.

Notitie

Code die als host fungeert voor de algemene taalruntime, kan de grootte instellen met behulp van de ICorThreadpool::CorSetMaxThreads methode.

Minimumaantal threadgroepen

De threadgroep biedt nieuwe werkrolthreads of I/O-voltooiingsthreads op aanvraag totdat deze een opgegeven minimum voor elke categorie bereikt. U kunt de ThreadPool.GetMinThreads methode gebruiken om deze minimumwaarden te verkrijgen.

Notitie

Wanneer de vraag laag is, kan het werkelijke aantal threadgroepthreads onder de minimumwaarden vallen.

Wanneer een minimum is bereikt, kan de threadgroep extra threads maken of wachten totdat bepaalde taken zijn voltooid. De threadgroep maakt en vernietigt werkthreads om de doorvoer te optimaliseren, wat 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.

Let op

U kunt de ThreadPool.SetMinThreads methode gebruiken om het minimum aantal niet-actieve 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.

De threadgroep gebruiken

De eenvoudigste manier om de threadgroep te gebruiken, is door de TPL (Task Parallel Library) te gebruiken. Standaard worden TPL-typen zoals Task threadpoolthreads gebruikt om Task<TResult> taken uit te voeren.

U kunt de threadgroep ook gebruiken door aan te roepen ThreadPool.QueueUserWorkItem vanuit beheerde code (of ICorThreadpool::CorQueueUserWorkItem vanuit onbeheerde code) en een System.Threading.WaitCallback gemachtigde door te geven die de methode vertegenwoordigt waarmee de taak wordt uitgevoerd.

Een andere manier om de threadgroep te gebruiken, is om werkitems in de wachtrij te plaatsen die zijn gerelateerd aan een wachtbewerking met behulp van de ThreadPool.RegisterWaitForSingleObject methode en een methode door te geven die, wanneer er een System.Threading.WaitHandle time-out optreedt, de methode aanroept die wordt vertegenwoordigd door de System.Threading.WaitOrTimerCallback gemachtigde. Threadpoolthreads worden gebruikt om callback-methoden aan te roepen.

Voor de voorbeelden controleert u de API-pagina's waarnaar wordt verwezen.

Beveiligingscontroles overslaan

De threadpool biedt ook de ThreadPool.UnsafeQueueUserWorkItem en ThreadPool.UnsafeRegisterWaitForSingleObject methoden. Gebruik deze methoden alleen als u zeker weet dat de stack van de aanroeper niet relevant is voor eventuele beveiligingscontroles die worden uitgevoerd tijdens de uitvoering van de taak in de wachtrij. ThreadPool.QueueUserWorkItem en ThreadPool.RegisterWaitForSingleObject beide leggen de stack van de aanroeper vast, die wordt samengevoegd in de stack van de threadgroep wanneer de thread een taak begint uit te voeren. Als een beveiligingscontrole is vereist, moet de hele stack worden gecontroleerd. Hoewel de controle veiligheid biedt, heeft deze ook een prestatiekosten.

Wanneer threads niet worden gebruikt

Er zijn verschillende scenario's waarin het geschikt is om uw eigen threads te maken en te beheren in plaats van threadpoolthreads te gebruiken:

  • U hebt een voorgrondthread nodig.
  • U hebt een thread nodig om een bepaalde prioriteit te hebben.
  • U hebt taken waardoor de thread lange tijdsperioden blokkeert. De threadgroep heeft een maximum aantal threads, dus een groot aantal geblokkeerde threadpoolthreads kan voorkomen dat taken worden gestart.
  • U moet threads in een appartement met één thread plaatsen. Alle ThreadPool threads bevinden zich in het multithreaded appartement.
  • U moet een stabiele identiteit hebben die is gekoppeld aan de thread of om een thread toe te kennen aan een taak.

Zie ook