ThreadPool Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
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 abstract sealed
public ref class ThreadPool sealed
public static class ThreadPool
public sealed class ThreadPool
type ThreadPool = class
Public Class ThreadPool
Public NotInheritable Class ThreadPool
- Dziedziczenie
-
ThreadPool
Przykłady
W poniższym przykładzie główny wątek aplikacji kolejkuje metodę o nazwie ThreadProc
, która ma zostać wykonana w wątku puli wątków, spa na jedną sekundę, a następnie kończy działanie. Metoda ThreadProc
po prostu wyświetla komunikat.
using namespace System;
using namespace System::Threading;
ref class Example
{
public:
// This thread procedure performs the task.
static void ThreadProc(Object^ stateInfo)
{
// No state object was passed to QueueUserWorkItem, so stateInfo is 0.
Console::WriteLine( "Hello from the thread pool." );
}
};
int main()
{
// Queue the task.
ThreadPool::QueueUserWorkItem(gcnew WaitCallback(Example::ThreadProc));
Console::WriteLine("Main thread does some work, then sleeps.");
Thread::Sleep(1000);
Console::WriteLine("Main thread exits.");
return 0;
}
// The example displays output like the following:
// Main thread does some work, then sleeps.
// Hello from the thread pool.
// Main thread exits.
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 warunku 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 pod kątem zmiany lub aktualizacji informacji o stanie. 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.
Asynchroniczne czasomierze 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.
Gdy używasz zarejestrowanych dojść oczekiwania, wątek systemowy monitoruje stan uchwytów oczekiwania. Po zakończeniu operacji oczekiwania wątek roboczy z puli wątków wykonuje odpowiednią funkcję wywołania zwrotnego.
Po wywołaniu QueueUserWorkItem metody w celu kolejkowania metody do wykonania w wątku puli wątków. W tym celu należy przekazać metodę delegata WaitCallback . Pełnomocnik 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) .
Uwaga
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żne
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 analizuje lokalny magazyn wątków lub pola oznaczone atrybutem ThreadStaticAttribute , znalezione wartości mogą zostać pozostawione z wcześniejszego użycia wątku puli wątków.
Można również kolejkować elementy robocze, 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óry zostanie wywołany 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 .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.
Uwaga
Niezarządzany kod hostujący .NET Framework może zmienić rozmiar puli wątków przy użyciu CorSetMaxThreads
funkcji 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 .NET Framework 4, pula wątków tworzy i niszczy wątki robocze w celu zoptymalizowania przepływności, która jest zdefiniowana 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.
Uwaga
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.
Przestroga
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 przy użyciu własnego algorytmu przydzielania wątków.
Właściwości
CompletedWorkItemCount |
Pobiera liczbę przetworzonych do tej pory elementów roboczych. |
PendingWorkItemCount |
Pobiera liczbę elementów roboczych, które są obecnie kolejkowane do przetworzenia. |
ThreadCount |
Pobiera liczbę wątków puli wątków, które obecnie istnieją. |
Metody
BindHandle(IntPtr) |
Przestarzałe.
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ątków zwracanych przez metodę GetMaxThreads(Int32, Int32) i 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, gdy są wykonywane nowe żądania, przed przełączeniem do algorytmu zarządzania tworzeniem i niszczeniem wątków. |
QueueUserWorkItem(WaitCallback) |
Kolejkuje metodę wykonywania. Metoda jest wykonywana, gdy wątek puli wątków stanie się dostępny. |
QueueUserWorkItem(WaitCallback, Object) |
Kolejkuje metodę wykonywania i określa obiekt zawierający dane, które mają być używane przez metodę . Metoda jest wykonywana, gdy wątek puli wątków stanie się dostępny. |
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, gdy wątek puli wątków stanie się dostępny. |
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) |
Rejestruje delegata, aby czekać na WaitHandle, określając 32-bitową liczbę całkowitą ze znakiem limitu czasu w milisekundach. |
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) |
Rejestruje delegata do oczekiwania na WaitHandle, określając 64-bitową liczbę całkowitą ze znakiem limitu czasu w milisekundach. |
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) |
Rejestruje delegata do oczekiwania na WaitHandle, określając TimeSpan wartość limitu czasu. |
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) |
Rejestruje delegata do oczekiwania 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, gdy są wykonywane nowe żądania, przed przełączeniem do algorytmu zarządzania tworzeniem i niszczeniem wątków. |
UnsafeQueueNativeOverlapped(NativeOverlapped*) |
Kolejkuje nakładaną się operację we/wy na potrzeby wykonywania. |
UnsafeQueueUserWorkItem(IThreadPoolWorkItem, Boolean) |
Kolejkuje określony obiekt elementu roboczego do puli wątków. |
UnsafeQueueUserWorkItem(WaitCallback, Object) |
Kolejkuje określonego delegata do puli wątków, ale nie propaguje stosu wywołującego do wątku roboczego. |
UnsafeQueueUserWorkItem<TState>(Action<TState>, TState, Boolean) |
Kolejkuje metodę określoną przez Action<T> delegata do wykonania i określa obiekt zawierający dane, które mają być używane przez metodę . Metoda jest wykonywana, gdy wątek puli wątków stanie się dostępny. |
UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) |
Rejestruje delegata do oczekiwania na WaitHandle, używając 32-bitowej liczby całkowitej ze znakiem limitu czasu w milisekundach. Ta metoda nie propaguje stosu wywołującego do wątku roboczego. |
UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) |
Rejestruje delegata do oczekiwania na WaitHandle, określając 64-bitową liczbę całkowitą ze znakiem limitu czasu w milisekundach. Ta metoda nie propaguje stosu wywołującego do wątku roboczego. |
UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) |
Rejestruje delegata do oczekiwania 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 do oczekiwania 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ątkowo.