Dieser Artikel wurde manuell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. |
Übersetzung
Original
|
ThreadPool-Klasse
Stellt einen Threadpool bereit, der verwendet werden kann, um Aufgaben auszuführen, Arbeitsaufgaben bereitzustellen, asynchrone E/A zu verarbeiten, im Auftrag anderer Threads zu warten und Zeitgeber zu verarbeiten.
Assembly: mscorlib (in mscorlib.dll)
Der ThreadPool-Typ macht die folgenden Member verfügbar.
| Name | Beschreibung | |
|---|---|---|
|
BindHandle(IntPtr) | Veraltet. Bindet ein Betriebssystemhandle an den ThreadPool. |
|
BindHandle(SafeHandle) | Bindet ein Betriebssystemhandle an den ThreadPool. |
|
GetAvailableThreads | Ruft die Differenz zwischen der von der GetMaxThreads-Methode zurückgegebenen maximalen Anzahl der Threads im Threadpool und der Anzahl der gerade aktiven Threads ab. |
|
GetMaxThreads | Ruft die Anzahl der Anforderungen für den Threadpool ab, die gleichzeitig aktiv sein können. Alle über diese Zahl hinausgehenden Anforderungen bleiben in der Warteschlange, bis die Threads des Threadpools verfügbar sind. |
|
GetMinThreads | Ruft die Mindestanzahl von Threads ab, die der Threadpool bei Bedarf erstellt, wenn neue Anforderungen gestellt werden, bevor zu einem Algorithmus zum Verwalten von Threaderstellung und -löschung gewechselt wird. |
|
QueueUserWorkItem(WaitCallback) | Fügt der Warteschlange eine auszuführende Methode hinzu. Die Methode wird ausgeführt, wenn ein Thread des Threadpools verfügbar wird. |
|
QueueUserWorkItem(WaitCallback, Object) | Fügt der Warteschlange eine auszuführende Methode hinzu und gibt ein Objekt an, das die von der Methode zu verwendenden Daten enthält. Die Methode wird ausgeführt, wenn ein Thread des Threadpools verfügbar wird. |
|
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) | Registriert einen Delegaten, der auf eine WaitHandle-Klasse wartet, wobei für das Timeout in Millisekunden eine 32-Bit-Ganzzahl mit Vorzeichen angegeben wird. |
|
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) | Registriert einen Delegaten, der auf eine WaitHandle-Klasse wartet, wobei für das Timeout in Millisekunden eine 64-Bit-Ganzzahl mit Vorzeichen angegeben wird. |
|
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) | Registriert einen Delegaten, der auf eine WaitHandle-Klasse wartet, und gibt einen TimeSpan-Wert für das Timeout an. |
|
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) | Registriert einen Delegaten, der auf eine WaitHandle-Klasse wartet, wobei für das Timeout in Millisekunden eine 32-Bit-Ganzzahl ohne Vorzeichen angegeben wird. |
|
SetMaxThreads | Legt die Anzahl der Anforderungen für den Threadpool fest, die gleichzeitig aktiv sein können. Alle über diese Zahl hinausgehenden Anforderungen bleiben in der Warteschlange, bis die Threads des Threadpools verfügbar sind. |
|
SetMinThreads | Legt die Mindestanzahl von Threads fest, die der Threadpool bei Bedarf erstellt, wenn neue Anforderungen gestellt werden, bevor zu einem Algorithmus zum Verwalten von Threaderstellung und -löschung gewechselt wird. |
|
UnsafeQueueNativeOverlapped | Stellt einen überlappenden E/A-Vorgang zur Ausführung in die Warteschlange. |
|
UnsafeQueueUserWorkItem | Stellt den angegebenen Delegaten in eine Warteschlange für den Threadpool, leitet die Aufrufliste jedoch nicht an den Arbeitsthread weiter. |
|
UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) | Registriert einen Delegaten, der auf eine WaitHandle-Klasse wartet, wobei für das Timeout in Millisekunden eine 32-Bit-Ganzzahl mit Vorzeichen verwendet wird. Diese Methode leitet den aufrufenden Stapel nicht an den Arbeitsthread weiter. |
|
UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) | Registriert einen Delegaten, der auf eine WaitHandle-Klasse wartet, wobei für das Timeout in Millisekunden eine 64-Bit-Ganzzahl mit Vorzeichen angegeben wird. Diese Methode leitet den aufrufenden Stapel nicht an den Arbeitsthread weiter. |
|
UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) | Registriert einen Delegaten, der auf eine WaitHandle-Klasse wartet, und gibt einen TimeSpan-Wert für das Timeout an. Diese Methode leitet den aufrufenden Stapel nicht an den Arbeitsthread weiter. |
|
UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) | Registriert einen Delegaten, der auf eine WaitHandle-Klasse wartet, wobei für das Timeout in Millisekunden eine 32-Bit-Ganzzahl ohne Vorzeichen angegeben wird. Diese Methode leitet den aufrufenden Stapel nicht an den Arbeitsthread weiter. |
Viele Anwendungen erstellen Threads, die lange Zeit im Ruhezustand verbleiben und auf das Eintreten eines Ereignisses warten. Andere Threads gehen in einen Ruhezustand über und verlassen diesen nur in periodischen Abständen, um Änderungen oder aktualisierte Statusinformationen abzufragen. Durch diesen Threadpool können Sie Threads effizienter einsetzen, indem Sie für die Anwendung einen Pool von systemverwalteten Arbeitsthreads bereitstellen. Beispiele für Vorgänge, die Threadpoolthreads verwenden:
-
Wenn Sie ein Task-Objekt oder Task<TResult>-Objekt erstellen, um eine Aufgabe asynchron auszuführen, wird für die Aufgabe standardmäßig die Ausführung auf einem Threadpoolthread geplant.
-
Asynchrone Zeitgeber verwenden den Threadpool. Threadpoolthreads führen Rückrufe von der System.Threading.Timer-Klasse aus und lösen Ereignisse aus der System.Timers.Timer-Klasse aus.
-
Wenn Sie registrierte Wait-Handles verwenden, überwacht ein Systemthread den Status der Wait-Handles. Nach Beendigung eines Wartevorgangs führt ein Arbeitsthread aus dem Threadpool die entsprechende Rückruffunktion aus.
Hinweis
|
|---|
|
Die Threads im verwalteten Threadpool sind Hintergrundthreads. Das heißt, ihre IsBackground-Eigenschaften sind true. Dies bedeutet, dass ein ThreadPool-Thread eine Anwendung nicht weiter ausführt, wenn alle Vordergrundthreads beendet sind. |
Sie können außerdem Arbeitsaufgaben in die Warteschlange aufnehmen, die keinen Bezug zu einem Wartevorgang für den Threadpool haben. Um das Behandeln einer Arbeitsaufgabe von einem Thread im Threadpool anzufordern, rufen Sie die QueueUserWorkItem-Methode auf. Diese Methode verwendet als Parameter einen Verweis auf die Methode oder auf den Delegaten, die bzw. der von dem aus dem Threadpool ausgewählten Thread aufgerufen wird. Sobald eine Arbeitsaufgabe in die Warteschlange aufgenommen wurde, kann sie nicht mehr abgebrochen werden.
Auch Zeitgeber von Zeitgeberwarteschlangen und registrierte Wartevorgänge verwenden den Threadpool. Die zugehörigen Rückruffunktionen werden an eine Warteschlange für den Threadpool übergeben.
Es gibt einen Threadpool pro Prozess. Ab .NET Framework, Version 4 ist die Standardgröße des Threadpools für einen Prozess von mehreren Faktoren abhängig, z. B. von der Größe des virtuellen Adressraums. Ein Prozess kann die GetMaxThreads-Methode aufrufen, um die Anzahl der Threads zu bestimmen. Die Anzahl der Threads im Threadpool kann mithilfe der SetMaxThreads-Methode geändert werden. Jeder Thread verwendet die Standardstapelgröße und wird mit Standardpriorität ausgeführt.
Hinweis
|
|---|
|
Nicht verwalteter Code, der das .NET Framework hostet, kann die Größe des Threadpools mithilfe der CorSetMaxThreads-Funktion ändern, die in der Datei mscoree.h definiert ist. |
Der Threadpool stellt neue Arbeitsthreads oder E/A-Abschlussthreads bei Bedarf bereit, bis der Mindestwert für jede Kategorie erreicht ist. Wenn ein Minimum erreicht wird, kann der Threadpool weitere Threads in dieser Kategorie erstellen oder warten, bis einige Aufgaben abgeschlossen sind. Ab .NET Framework 4 erstellt und zerstört der Threadpool Arbeitsthreads, um den Durchsatz zu optimieren. Der Durchsatz ist als die Anzahl der Aufgaben definiert, die pro Zeiteinheit abgeschlossen werden. Bei zu wenigen Threads werden die verfügbaren Ressourcen möglicherweise nicht optimal ausgenutzt, wohingegen bei zu vielen Threads Ressourcenkonflikte auftreten können.
Hinweis
|
|---|
|
Wenn die Anforderungen niedrig sind, kann die tatsächliche Anzahl der Threads im Threadpool unterhalb der Mindestwerte liegen. |
Sie können die GetMinThreads-Methode verwenden, um diese Mindestwerte abzurufen.
Vorsicht
|
|---|
|
Sie können die SetMinThreads-Methode verwenden, um die Mindestanzahl an Threads zu erhöhen. Allerdings kann ein unnötiges Erhöhen dieses Wertes zu Leistungsproblemen führen. Wenn zu viele Aufgaben zum gleichen Zeitpunkt gestartet werden, werden möglicherweise alle langsam ausgeführt. In den meisten Fällen erreicht der Threadpool mit dem eigenen Algorithmus für die Zuordnung von Threads eine bessere Leistung. |
Wenn der Threadpool einen Thread wiederverwendet, werden die Daten im lokalen Threadspeicher und in den mit dem ThreadStaticAttribute-Attribut markierten Feldern nicht gelöscht. Daten, die von einer Methode im lokalen Threadspeicher gespeichert werden, sind also für jede andere Methode zugänglich, die im selben Thread im Threadpool ausgeführt wird. Wenn eine Methode auf ein mit dem ThreadStaticAttribute-Attribut markiertes Feld zugreift, kann das Feld abhängig davon, in welchem Thread im Threadpool die Ausführung erfolgt, unterschiedliche Daten enthalten.
Hinweis
|
|---|
|
Das auf diesen Typ oder Member angewendete HostProtectionAttribute-Attribut besitzt den folgenden Resources-Eigenschaftswert: Synchronization | ExternalThreading. Das HostProtectionAttribute hat keine Auswirkungen auf Desktopanwendungen (die normalerweise durch Doppelklicken auf ein Symbol, Eingeben eines Befehls oder einer URL in einem Browser gestartet werden). Weitere Informationen finden Sie unter der HostProtectionAttribute-Klasse oder unter SQL Server-Programmierung und Hostschutzattribute. |
using System; using System.Threading; public class Example { public static void Main() { // Queue the task. ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc)); Console.WriteLine("Main thread does some work, then sleeps."); // If you comment out the Sleep, the main thread exits before // the thread pool task runs. The thread pool uses background // threads, which do not keep the application running. (This // is a simple example of a race condition.) 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."); } }
Windows 7, Windows Vista SP1 oder höher, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (Server Core wird nicht unterstützt), Windows Server 2008 R2 (Server Core wird mit SP1 oder höher unterstützt), Windows Server 2003 SP2
.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.
Hinweis
Vorsicht