Dela via


Den hanterade trådpoolen

Klassen System.Threading.ThreadPool ger ditt program en pool med arbetstrådar som hanteras av systemet, så att du kan koncentrera dig på programuppgifter i stället för trådhantering. Om du har korta uppgifter som kräver bakgrundsbearbetning är den hanterade trådpoolen ett enkelt sätt att dra nytta av flera trådar. Det är betydligt enklare att använda trådpoolen i Framework 4 och senare, eftersom du kan skapa Task och Task<TResult> objekt som utför asynkrona uppgifter på trådpooltrådar.

.NET använder trådpoolstrådar för många syften, inklusive åtgärder för aktivitetsparallellt bibliotek (TPL), asynkron I/O-slutförande, timeråteranrop , registrerade vänteåtgärder, asynkrona metodanrop med ombud och System.Net socketanslutningar.

Egenskaper för trådpool

Trådpoolstrådar är bakgrundstrådar . Varje tråd använder standardstackens storlek, körs som standardprioritet och finns i den flertrådade lägenheten. När en tråd i trådpoolen har slutfört sin uppgift, returneras den till en kö med väntande trådar. Från och med nu kan den återanvändas. Den här återanvändningen gör det möjligt för program att undvika kostnaden för att skapa en ny tråd för varje uppgift.

Det finns bara en trådpool per process.

Undantag i trådpoolstrådar

Ohanterade undantag i trådpooltrådar avslutar processen. Det finns tre undantag till den här regeln:

Mer information finns i Undantag i hanterade trådar.

Maximalt antal trådpooltrådar

Antalet åtgärder som kan placeras i kö till trådpoolen begränsas endast av tillgängligt minne. Trådpoolen begränsar dock antalet trådar som kan vara aktiva i processen samtidigt. Om alla trådpoolstrådar är upptagna placeras ytterligare arbetsobjekt i kö tills trådar för att köra dem blir tillgängliga. Standardstorleken för trådpoolen för en process beror på flera faktorer, till exempel storleken på det virtuella adressutrymmet. En process kan anropa ThreadPool.GetMaxThreads metoden för att fastställa antalet trådar.

Du kan styra det maximala antalet trådar med hjälp ThreadPool.GetMaxThreads av metoderna och ThreadPool.SetMaxThreads .

Kommentar

Kod som är värd för den vanliga språkkörningen kan ange storleken med hjälp av ICorThreadpool::CorSetMaxThreads metoden.

Minsta antal trådpooler

Trådpoolen innehåller nya arbetstrådar eller I/O-slutförandetrådar på begäran tills den når ett angivet minimum för varje kategori. Du kan använda ThreadPool.GetMinThreads metoden för att hämta dessa minimivärden.

Kommentar

När efterfrågan är låg kan det faktiska antalet trådpooltrådar understiga minimivärdena.

När ett minimum har uppnåtts kan trådpoolen skapa ytterligare trådar eller vänta tills vissa uppgifter har slutförts. Trådpoolen skapar och förstör arbetstrådar för att optimera dataflödet, vilket definieras som antalet uppgifter som slutförs per tidsenhet. För få trådar kanske inte använder tillgängliga resurser optimalt, medan för många trådar kan öka resurskonkurrationen.

Varning

Du kan använda ThreadPool.SetMinThreads metoden för att öka det minsta antalet inaktiva trådar. Att öka dessa värden i onödan kan dock orsaka prestandaproblem. Om för många aktiviteter startar samtidigt kan alla verka vara långsamma. I de flesta fall presterar trådpoolen bättre med sin egen algoritm för allokering av trådar.

Använda trådpoolen

Det enklaste sättet att använda trådpoolen är att använda TPL (Task Parallel Library). Som standard kan TPL-typer som Task och Task<TResult> använda trådpooltrådar för att köra uppgifter.

Du kan också använda trådpoolen genom att anropa ThreadPool.QueueUserWorkItem från hanterad kod (eller ICorThreadpool::CorQueueUserWorkItem från ohanterad kod) och skicka ett System.Threading.WaitCallback ombud som representerar den metod som utför uppgiften.

Ett annat sätt att använda trådpoolen är att köa arbetsobjekt som är relaterade till en vänteåtgärd med hjälp ThreadPool.RegisterWaitForSingleObject av metoden och skicka en System.Threading.WaitHandle som, när den signaleras eller när tidsgränsen nås, anropar metoden som representeras av ombudet System.Threading.WaitOrTimerCallback . Trådpooltrådar används för att anropa motringningsmetoder.

I exemplen kontrollerar du de refererade API-sidorna.

Hoppar över säkerhetskontroller

Trådpoolen ThreadPool.UnsafeQueueUserWorkItem innehåller också metoderna och ThreadPool.UnsafeRegisterWaitForSingleObject . Använd endast dessa metoder när du är säker på att anroparens stack inte är relevant för säkerhetskontroller som utförs under körningen av den köade aktiviteten. ThreadPool.QueueUserWorkItem och ThreadPool.RegisterWaitForSingleObject båda avbildar anroparens stack, som sammanfogas till stacken i trådpooltråden när tråden börjar köra en uppgift. Om en säkerhetskontroll krävs måste hela stacken kontrolleras. Även om kontrollen ger säkerhet har den också en prestandakostnad.

När du inte ska använda trådpoolstrådar

Det finns flera scenarier där det är lämpligt att skapa och hantera egna trådar i stället för att använda trådpooltrådar:

  • Du behöver en förgrundstråd.
  • Du behöver en tråd för att ha en viss prioritet.
  • Du har uppgifter som gör att tråden blockeras under långa tidsperioder. Trådpoolen har ett maximalt antal trådar, så ett stort antal blockerade trådpooltrådar kan hindra aktiviteter från att starta.
  • Du måste placera trådar i en enkeltrådad lägenhet. Alla ThreadPool trådar finns i den flertrådade lägenheten.
  • Du måste ha en stabil identitet som är associerad med tråden eller för att ägna en tråd åt en uppgift.

Se även