Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die System.Threading.ThreadPool Klasse stellt Ihre Anwendung mit einem Pool von Workerthreads bereit, die vom System verwaltet werden, sodass Sie sich nicht auf Threadverwaltung, sondern auf Anwendungsaufgaben konzentrieren können. Wenn Sie kurze Aufgaben haben, die Hintergrundverarbeitung erfordern, ist der verwaltete Threadpool eine einfache Möglichkeit, mehrere Threads zu nutzen. Die Verwendung des Threadpools ist in Framework 4 und höher erheblich einfacher, da Sie Task und Task<TResult> Objekte erstellen können, die asynchrone Aufgaben in Threadpool-Threads ausführen.
Threadpoolthreads werden in .NET für viele Zwecke verwendet. Dazu gehören Task Parallel Library-Vorgänge (TPL), asynchrone E/A-Komplettierung, Timerrückrufe, registrierte Wartevorgänge, asynchrone Methodenaufrufe mithilfe von Delegaten und System.Net-Socketverbindungen.
Eigenschaften von Threadpools
Threadpool-Threads sind Hintergrundthreads . Jeder Thread verwendet die Standardstapelgröße, wird mit der Standardpriorität ausgeführt und befindet sich in der Multithread-Wohnung. Sobald ein Thread im Threadpool seine Aufgabe abgeschlossen hat, wird er in eine Warteschleife mit Wartethreads zurückgegeben. Ab diesem Moment kann es wiederverwendet werden. Diese Wiederverwendung ermöglicht Es Anwendungen, die Kosten für die Erstellung eines neuen Threads für jeden Vorgang zu vermeiden.
Pro Prozess gibt es nur einen Threadpool.
Ausnahmen in Threadpoolthreads
Unbehandelte Ausnahmen in den Threadpool-Threads beenden den Prozess. Es gibt jedoch drei Ausnahmen von dieser Regel:
- In einem Threadpoolthread wird eine System.Threading.ThreadAbortException-Ausnahme ausgelöst, da Thread.Abort aufgerufen wurde.
- In einem Threadpoolthread wird eine System.AppDomainUnloadedException-Ausnahme ausgelöst, da die Anwendungsdomäne entladen wird.
- Die Common Language Runtime oder ein Hostprozess beendet den Thread.
Weitere Informationen finden Sie unter Ausnahmen in verwalteten Threads.
Maximale Anzahl von Threads im Threadpool
Die Anzahl der Vorgänge, die im Threadpool in die Warteschlange gestellt werden können, ist nur durch verfügbaren Arbeitsspeicher begrenzt. Der Threadpool beschränkt jedoch die Anzahl der Threads, die gleichzeitig im Prozess aktiv sein können. Wenn alle Threadpoolthreads ausgelastet sind, werden zusätzliche Arbeitsaufgaben in die Warteschlange gestellt, bis Threads zur Ausführung verfügbar sind. Die Standardgröße des Threadpools für einen Prozess hängt von mehreren Faktoren ab, z. B. von der Größe des virtuellen Adressraums. Ein Prozess kann die ThreadPool.GetMaxThreads Methode aufrufen, um die Anzahl der Threads zu ermitteln.
Sie können die maximale Anzahl von Threads mithilfe der ThreadPool.GetMaxThreads und ThreadPool.SetMaxThreads Methoden steuern.
Hinweis
Code, der die Common Language Runtime hostet, kann die Größe mithilfe der ICorThreadpool::CorSetMaxThreads Methode festlegen.
Mindestwerte für den Threadpool
Der Threadpool stellt neue Arbeitsthreads oder E/A-Vervollständigungsthreads bei Bedarf bereit, bis er ein bestimmtes Minimum für jede Kategorie erreicht. Sie können die ThreadPool.GetMinThreads Methode verwenden, um diese Mindestwerte abzurufen.
Hinweis
Wenn die Anforderungen niedrig sind, kann die tatsächliche Anzahl der Threads im Threadpool unterhalb der Mindestwerte liegen.
Wenn ein Minimum erreicht ist, kann der Threadpool zusätzliche Threads erstellen oder warten, bis einige Aufgaben abgeschlossen sind. Der Threadpool erstellt und zerstört Arbeitsthreads, um den Durchsatz zu optimieren, der als die Anzahl der Aufgaben definiert ist, die pro Zeiteinheit abgeschlossen werden. Bei zu wenigen Threads werden die verfügbaren Ressourcen möglicherweise nicht optimal genutzt, wohingegen bei zu vielen Threads Ressourcenkonflikte auftreten können.
Vorsicht
Sie können die ThreadPool.SetMinThreads Methode verwenden, um die minimale Anzahl von Leerlaufthreads zu erhöhen. Eine unnötige Erhöhung dieser Werte kann jedoch zu Leistungsproblemen führen. Wenn zu viele Vorgänge gleichzeitig beginnen, scheinen alle vorgänge langsam zu sein. In den meisten Fällen arbeitet der Threadpool mit seinem eigenen Algorithmus zur Thread-Zuweisung effizienter.
Verwenden des Threadpools
Die einfachste Möglichkeit zum Verwenden des Threadpools besteht darin, die Task Parallel Library (TPL) zu verwenden. Standardmäßig verwenden TPL-Typen wie Task und Task<TResult> Threadpool-Threads, um Aufgaben auszuführen.
Sie können den Threadpool auch verwenden, indem Sie ThreadPool.QueueUserWorkItem von verwaltetem Code (oder ICorThreadpool::CorQueueUserWorkItem aus nicht verwaltetem Code) aufrufen und einen Delegaten System.Threading.WaitCallback übergeben, der die Methode darstellt, die die Aufgabe ausführt.
Eine andere Möglichkeit, den Threadpool zu verwenden, ist, Arbeitselemente, die mit einem Wartevorgang verknüpft sind, mit der ThreadPool.RegisterWaitForSingleObject-Methode in die Warteschlange zu stellen und ein System.Threading.WaitHandle zu übergeben, das bei einer Signalisierung oder einem Timeout die Methode aufruft, die vom System.Threading.WaitOrTimerCallback-Delegaten dargestellt wird. Threadpoolthreads werden zum Aufrufen von Rückrufmethoden verwendet.
Überprüfen Sie für die Beispiele die referenzierten API-Seiten.
Überspringen von Sicherheitsüberprüfungen
Der Threadpool stellt außerdem die ThreadPool.UnsafeQueueUserWorkItem und ThreadPool.UnsafeRegisterWaitForSingleObject Methoden bereit. Verwenden Sie diese Methoden nur, wenn Sie sicher sind, dass der Stapel des Aufrufers irrelevant für die Sicherheitsüberprüfungen ist, die während der Ausführung der in der Warteschlange stehenden Aufgabe stattfinden. ThreadPool.QueueUserWorkItem und ThreadPool.RegisterWaitForSingleObject erfassen beide den Stapel des Aufrufers, der mit dem Stapel des Threadpoolthreads zusammengeführt wird, wenn der Thread beginnt, eine Aufgabe auszuführen. Wenn eine Sicherheitsüberprüfung erforderlich ist, muss der gesamte Stapel überprüft werden. Obwohl die Prüfung Sicherheit bietet, hat sie auch einen Leistungsaufwand.
Gründe, die gegen die Verwendung von Threadpools sprechen
Es gibt mehrere Szenarien, in denen es sinnvoll ist, eigene Threads zu erstellen und zu verwalten, anstatt Threadpoolthreads zu verwenden:
- Sie benötigen einen Vordergrundthread.
- Sie benötigen einen Thread, um eine bestimmte Priorität zu haben.
- Sie haben Aufgaben, die dazu führen, dass der Thread für lange Zeiträume blockiert wird. Der Threadpool verfügt über eine maximale Anzahl von Threads, sodass eine große Anzahl blockierter Threadpoolthreads den Start von Aufgaben verhindern kann.
- Sie müssen Threads in ein Singlethread-Apartment einfügen. Alle ThreadPool-Threads befinden sich im Multithread-Apartment.
- Sie müssen über eine stabile Identität verfügen, die dem Thread zugeordnet ist, oder um einen Thread einer Aufgabe zuzuweisen.