ThreadPool Klass

Definition

Tillhandahåller en pool med trådar som kan användas för att köra uppgifter, publicera arbetsobjekt, bearbeta asynkron I/O, vänta för andra trådar och bearbeta timers.

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
Arv
ThreadPool

Exempel

I följande exempel köar huvudprogramtråden en metod med namnet ThreadProc för att köra på en trådpooltråd, viloläge för en sekund och avslutas sedan. Metoden ThreadProc visar helt enkelt ett meddelande.

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.

Om du kommenterar ut anropet Thread.Sleep till metoden avslutas huvudtråden innan metoden körs på trådpooltråden. Trådpoolen använder bakgrundstrådar som inte håller programmet igång om alla förgrundstrådar har avslutats. (Detta är ett enkelt exempel på ett konkurrenstillstånd.)

Kommentarer

Många program skapar trådar som tillbringar mycket tid i viloläge och väntar på att en händelse ska inträffa. Andra trådar kan ange ett vilande tillstånd som bara ska väckas regelbundet för att söka efter information om ändrings- eller uppdateringsstatus. Med trådpoolen kan du använda trådar mer effektivt genom att ge ditt program en pool med arbetstrådar som hanteras av systemet. Exempel på åtgärder som använder trådpoolstrådar är följande:

  • När du skapar ett Task eller Task<TResult> -objekt för att utföra en viss uppgift asynkront schemaläggs aktiviteten som standard att köras i en trådpoolstråd.

  • Asynkrona timers använder trådpoolen. Trådpooltrådar kör återanrop från System.Threading.Timer klassen och genererar händelser från System.Timers.Timer klassen.

  • När du använder registrerade väntehandtag övervakar en systemtråd statusen för väntehandtagen. När en vänteåtgärd är klar kör en arbetstråd från trådpoolen motsvarande återanropsfunktion.

  • När du anropar QueueUserWorkItem metoden för att köa en metod för körning på en trådpoolstråd. Det gör du genom att skicka metoden till ett WaitCallback ombud. Ombudet har signaturen

    void WaitCallback(Object state)
    
    Sub WaitCallback(state As Object)
    

    där state är ett objekt som innehåller data som ska användas av ombudet. Faktiska data kan skickas till ombudet genom att anropa QueueUserWorkItem(WaitCallback, Object) metoden.

Note

Trådarna i den hanterade trådpoolen är bakgrundstrådar. Deras egenskaper är truealltså IsBackground . Det innebär att en ThreadPool tråd inte håller ett program igång när alla förgrundstrådar har avslutats.

Important

När trådpoolen återanvänder en tråd rensas inte data i trådens lokala lagring eller i fält som är markerade med ThreadStaticAttribute attributet. När en metod undersöker trådens lokala lagring eller fält som är markerade med ThreadStaticAttribute attributet kan därför de värden som hittas vara kvar från en tidigare användning av trådpoolstråden.

Du kan också köa arbetsobjekt som inte är relaterade till en vänteåtgärd till trådpoolen. Om du vill begära att ett arbetsobjekt ska hanteras av en tråd i trådpoolen anropar du QueueUserWorkItem metoden. Den här metoden tar som parameter en referens till metoden eller ombudet som anropas av den tråd som valts från trådpoolen. Det går inte att avbryta ett arbetsobjekt när det har placerats i kö.

Timer-queue-timers och registrerade vänteåtgärder använder också trådpoolen. Deras återanropsfunktioner placeras i kö till trådpoolen.

Det finns en trådpool per process. Från och med .NET Framework 4 beror standardstorleken på trådpoolen för en process på flera faktorer, till exempel storleken på det virtuella adressutrymmet. En process kan anropa GetMaxThreads metoden för att fastställa antalet trådar. Antalet trådar i trådpoolen kan ändras med hjälp SetMaxThreads av metoden . Varje tråd använder standardstackens storlek och körs med standardprioritet.

Note

Ohanterad kod som är värd för .NET Framework kan ändra storleken på trådpoolen med hjälp av funktionen CorSetMaxThreads som definierats i filen mscoree.h.

Trådpoolen innehåller nya arbetstrådar eller I/O-slutförandetrådar på begäran tills den når maxgränsen för varje kategori. När ett högsta värde har uppnåtts kan trådpoolen skapa ytterligare trådar i den kategorin eller vänta tills vissa uppgifter har slutförts. Från och med .NET Framework 4 skapar och förstör trådpoolen 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.

Note

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

Du kan använda GetMinThreads metoden för att hämta dessa minimivärden.

Caution

Du kan använda SetMinThreads metoden för att öka det minsta antalet 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.

Metoder

Name Description
BindHandle(IntPtr)
Föråldrad.

Binder ett operativsystemhandtag till ThreadPool.

BindHandle(SafeHandle)

Binder ett operativsystemhandtag till ThreadPool.

GetAvailableThreads(Int32, Int32)

Hämtar skillnaden mellan det maximala antalet trådpoolstrådar som returneras av GetMaxThreads(Int32, Int32) metoden och det antal som för närvarande är aktivt.

GetMaxThreads(Int32, Int32)

Hämtar antalet begäranden till trådpoolen som kan vara aktiv samtidigt. Alla begäranden ovanför det antalet förblir i kö tills trådpoolstrådar blir tillgängliga.

GetMinThreads(Int32, Int32)

Hämtar det minsta antalet trådar som trådpoolen skapar på begäran, när nya begäranden görs, innan du växlar till en algoritm för att hantera skapande och destruktion av trådar.

QueueUserWorkItem(WaitCallback, Object)

Köar en metod för körning och anger ett objekt som innehåller data som ska användas av metoden. Metoden körs när en trådpoolstråd blir tillgänglig.

QueueUserWorkItem(WaitCallback)

Köar en metod för körning. Metoden körs när en trådpoolstråd blir tillgänglig.

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

Köar en metod som anges av ett Action<T> ombud för körning och tillhandahåller data som ska användas av metoden. Metoden körs när en trådpoolstråd blir tillgänglig.

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

Registrerar ett ombud för att vänta på ett WaitHandle, och anger ett 32-bitars signerat heltal för tidsgränsen i millisekunder.

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

Registrerar ett ombud för att vänta på ett WaitHandle, och anger ett 64-bitars signerat heltal för tidsgränsen i millisekunder.

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

Registrerar ett ombud för att vänta på en WaitHandleoch anger ett TimeSpan värde för tidsgränsen.

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

Registrerar ett ombud för att vänta på ett WaitHandle, och anger ett 32-bitars osignerat heltal för tidsgränsen i millisekunder.

SetMaxThreads(Int32, Int32)

Anger antalet begäranden till trådpoolen som kan vara aktiv samtidigt. Alla begäranden ovanför det antalet förblir i kö tills trådpoolstrådar blir tillgängliga.

SetMinThreads(Int32, Int32)

Anger det minsta antalet trådar som trådpoolen skapar på begäran, när nya begäranden görs, innan du växlar till en algoritm för att hantera skapande och destruktion av trådar.

UnsafeQueueNativeOverlapped(NativeOverlapped*)

Köar en överlappande I/O-åtgärd för körning.

UnsafeQueueUserWorkItem(WaitCallback, Object)

Köar det angivna ombudet till trådpoolen, men sprider inte den anropande stacken till arbetstråden.

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

Registrerar ett ombud för att vänta på ett WaitHandle, med hjälp av ett 32-bitars signerat heltal för tidsgränsen i millisekunder. Den här metoden sprider inte anropsstacken till arbetstråden.

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

Registrerar ett ombud för att vänta på ett WaitHandle, och anger ett 64-bitars signerat heltal för tidsgränsen i millisekunder. Den här metoden sprider inte anropsstacken till arbetstråden.

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

Registrerar ett ombud för att vänta på en WaitHandleoch anger ett TimeSpan värde för tidsgränsen. Den här metoden sprider inte anropsstacken till arbetstråden.

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

Registrerar ett ombud för att vänta på ett WaitHandle, och anger ett 32-bitars osignerat heltal för tidsgränsen i millisekunder. Den här metoden sprider inte anropsstacken till arbetstråden.

Gäller för

Trådsäkerhet

Den här typen är trådsäker.

Se även