ThreadPool Klasa

Definicja

Udostępnia pulę wątków, które mogą służyć do wykonywania zadań, publikowania elementów roboczych, przetwarzania asynchronicznego we/wy, oczekiwania w imieniu innych wątków i czasomierzy przetwarzania.

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

Przykłady

W poniższym przykładzie główny wątek aplikacji kolejkuje metodę o nazwie ThreadProc do wykonania w wątku puli wątków, uśpienia przez jedną sekundę, a następnie kończy działanie. Metoda ThreadProc po prostu wyświetla komunikat.

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.

Jeśli oznaczysz jako komentarz wywołanie Thread.Sleep metody, główny wątek kończy działanie przed uruchomieniem metody w wątku puli wątków. Pula wątków używa wątków w tle, które nie zachowują działania aplikacji, jeśli wszystkie wątki pierwszego planu zostały zakończone. (Jest to prosty przykład stanu wyścigu).

Uwagi

Wiele aplikacji tworzy wątki, które spędzają dużo czasu w stanie uśpienia, czekając na wystąpienie zdarzenia. Inne wątki mogą wprowadzać stan uśpienia tylko do okresowego przebudzenia w celu sondowania informacji o zmianie lub aktualizacji stanu. Pula wątków umożliwia wydajniejsze korzystanie z wątków przez udostępnienie aplikacji puli wątków roboczych zarządzanych przez system. Przykłady operacji korzystających z wątków puli wątków obejmują następujące elementy:

  • Podczas tworzenia Task obiektu lub Task<TResult> do asynchronicznego wykonywania niektórych zadań domyślnie zadanie jest zaplanowane do uruchomienia w wątku puli wątków.

  • Czasomierze asynchroniczne używają puli wątków. Wątki puli wątków wykonują wywołania zwrotne z System.Threading.Timer klasy i zgłaszają zdarzenia z System.Timers.Timer klasy.

  • W przypadku korzystania z zarejestrowanych dojść oczekiwania wątek systemowy monitoruje stan uchwytów oczekiwania. Po zakończeniu operacji oczekiwania wątek procesu roboczego z puli wątków wykonuje odpowiednią funkcję wywołania zwrotnego.

  • Podczas wywoływania QueueUserWorkItem metody w celu kolejkowania metody do wykonania w wątku puli wątków. W tym celu należy przekazać metodę delegata WaitCallback . Delegat ma podpis

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

    gdzie state jest obiektem zawierającym dane, które mają być używane przez delegata. Rzeczywiste dane można przekazać do delegata, wywołując metodę QueueUserWorkItem(WaitCallback, Object) .

Note

Wątki w zarządzanej puli wątków są wątkami w tle. Oznacza to, że ich IsBackground właściwości to true. Oznacza to, że wątek ThreadPool nie będzie działać aplikacji po zakończeniu wszystkich wątków pierwszego planu.

Ważna

Gdy pula wątków ponownie używa wątku, nie usuwa danych w magazynie lokalnym wątku ani w polach oznaczonych atrybutem ThreadStaticAttribute . W związku z tym, gdy metoda sprawdza lokalny magazyn wątku lub pola oznaczone atrybutem ThreadStaticAttribute , znalezione wartości mogą być pozostawione z wcześniejszego użycia wątku puli wątków.

Możesz również umieścić elementy robocze w kolejce, które nie są powiązane z operacją oczekiwania do puli wątków. Aby zażądać obsługi elementu roboczego przez wątek w puli wątków, wywołaj metodę QueueUserWorkItem . Ta metoda przyjmuje jako parametr odwołanie do metody lub delegata, które będzie wywoływane przez wątek wybrany z puli wątków. Nie ma możliwości anulowania elementu roboczego po jego kolejce.

Czasomierze kolejki czasomierza i zarejestrowane operacje oczekiwania używają również puli wątków. Ich funkcje wywołania zwrotnego są kolejkowane do puli wątków.

Istnieje jedna pula wątków na proces. Począwszy od platformy .NET Framework 4, domyślny rozmiar puli wątków dla procesu zależy od kilku czynników, takich jak rozmiar wirtualnej przestrzeni adresowej. Proces może wywołać metodę GetMaxThreads w celu określenia liczby wątków. Liczbę wątków w puli wątków można zmienić przy użyciu SetMaxThreads metody . Każdy wątek używa domyślnego rozmiaru stosu i jest uruchamiany z domyślnym priorytetem.

Note

Niezarządzany kod hostujący .NET Framework może zmienić rozmiar puli wątków przy użyciu funkcji CorSetMaxThreads zdefiniowanej w pliku mscoree.h.

Pula wątków udostępnia nowe wątki robocze lub wątki uzupełniania we/wy na żądanie, dopóki nie osiągnie maksymalnej wartości dla każdej kategorii. Po osiągnięciu maksymalnej wartości pula wątków może utworzyć dodatkowe wątki w tej kategorii lub poczekać na ukończenie niektórych zadań. Począwszy od platformy .NET Framework 4, pula wątków tworzy i niszczy wątki robocze w celu zoptymalizowania przepływności, która jest definiowana jako liczba zadań, które są wykonywane na jednostkę czasu. Zbyt mało wątków może nie zapewnić optymalnego wykorzystania dostępnych zasobów, podczas gdy zbyt wiele wątków może zwiększyć rywalizację o zasoby.

Note

Gdy zapotrzebowanie jest niskie, rzeczywista liczba wątków puli wątków może spaść poniżej wartości minimalnych.

Możesz użyć GetMinThreads metody , aby uzyskać te minimalne wartości.

Caution

Możesz użyć SetMinThreads metody , aby zwiększyć minimalną liczbę wątków. Jednak niepotrzebne zwiększanie tych wartości może powodować problemy z wydajnością. Jeśli zbyt wiele zadań rozpoczyna się w tym samym czasie, wszystkie z nich mogą wydawać się powolne. W większości przypadków pula wątków będzie działać lepiej za pomocą własnego algorytmu przydzielania wątków.

Metody

Nazwa Opis
BindHandle(IntPtr)
Przestarzałe.

Tworzy powiązanie dojścia systemu operacyjnego do elementu ThreadPool.

BindHandle(SafeHandle)

Tworzy powiązanie dojścia systemu operacyjnego do elementu ThreadPool.

GetAvailableThreads(Int32, Int32)

Pobiera różnicę między maksymalną liczbą wątków wątek zwracanych przez metodę GetMaxThreads(Int32, Int32) , a liczbą aktualnie aktywną.

GetMaxThreads(Int32, Int32)

Pobiera liczbę żądań do puli wątków, które mogą być aktywne współbieżnie. Wszystkie żądania powyżej tej liczby pozostają w kolejce, dopóki wątki puli wątków nie staną się dostępne.

GetMinThreads(Int32, Int32)

Pobiera minimalną liczbę wątków tworzonych przez pulę wątków na żądanie, ponieważ są wykonywane nowe żądania, przed przełączeniem się do algorytmu do zarządzania tworzeniem i niszczeniem wątków.

QueueUserWorkItem(WaitCallback, Object)

Kolejkuje metodę wykonywania i określa obiekt zawierający dane, które mają być używane przez metodę . Metoda jest wykonywana po udostępnieniu wątku puli wątków.

QueueUserWorkItem(WaitCallback)

Kolejkuje metodę wykonywania. Metoda jest wykonywana po udostępnieniu wątku puli wątków.

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

Kolejkuje metodę określoną przez Action<T> delegata do wykonania i dostarcza dane, które mają być używane przez metodę . Metoda jest wykonywana po udostępnieniu wątku puli wątków.

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

Rejestruje pełnomocnika, aby poczekać na WaitHandle, określając 32-bitową liczbę całkowitą ze znakiem dla limitu czasu w milisekundach.

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

Rejestruje delegata, aby czekać na WaitHandle, określając 64-bitową liczbę całkowitą ze znakiem dla limitu czasu w milisekundach.

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

Rejestruje pełnomocnika, aby poczekać na WaitHandle, określając TimeSpan wartość limitu czasu.

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

Rejestruje delegata, aby czekać na WaitHandle, określając 32-bitową liczbę całkowitą bez znaku dla limitu czasu w milisekundach.

SetMaxThreads(Int32, Int32)

Ustawia liczbę żądań do puli wątków, które mogą być aktywne współbieżnie. Wszystkie żądania powyżej tej liczby pozostają w kolejce, dopóki wątki puli wątków nie staną się dostępne.

SetMinThreads(Int32, Int32)

Ustawia minimalną liczbę wątków tworzonych przez pulę wątków na żądanie, ponieważ nowe żądania są wykonywane, przed przełączeniem do algorytmu do zarządzania tworzeniem i niszczeniem wątków.

UnsafeQueueNativeOverlapped(NativeOverlapped*)

Kolejkuje nakładaną się operację we/wy na potrzeby wykonywania.

UnsafeQueueUserWorkItem(WaitCallback, Object)

Kolejkuje określonego delegata do puli wątków, ale nie propaguje stosu wywołań do wątku roboczego.

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

Rejestruje delegata, aby poczekać na WaitHandlewartość , używając 32-bitowej liczby całkowitej ze znakiem dla limitu czasu w milisekundach. Ta metoda nie propaguje stosu wywołującego do wątku roboczego.

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

Rejestruje delegata, aby czekać na WaitHandle, określając 64-bitową liczbę całkowitą ze znakiem dla limitu czasu w milisekundach. Ta metoda nie propaguje stosu wywołującego do wątku roboczego.

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

Rejestruje pełnomocnika, aby poczekać na WaitHandle, określając TimeSpan wartość limitu czasu. Ta metoda nie propaguje stosu wywołującego do wątku roboczego.

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

Rejestruje delegata, aby czekać na WaitHandle, określając 32-bitową liczbę całkowitą bez znaku dla limitu czasu w milisekundach. Ta metoda nie propaguje stosu wywołującego do wątku roboczego.

Dotyczy

Bezpieczeństwo wątkowe

Ten typ jest bezpieczny wątkiem.

Zobacz też