Der verwaltete ThreadpoolThe managed thread pool

Die System.Threading.ThreadPool-Klasse stellt einer Anwendung einen Pool von Arbeitsthreads bereit, die vom System verwaltet werden und Ihnen die Möglichkeit bieten, sich mehr auf Anwendungsaufgaben als auf die Threadverwaltung zu konzentrieren.The System.Threading.ThreadPool class provides your application with a pool of worker threads that are managed by the system, allowing you to concentrate on application tasks rather than thread management. Für kurze Aufgaben, bei denen Hintergrundverarbeitung erforderlich ist, bietet sich der verwaltete Threadpool als einfache Lösung für den Umgang mit mehreren Threads an.If you have short tasks that require background processing, the managed thread pool is an easy way to take advantage of multiple threads. Die Verwendung des Threadpools ist ab Version 4 des Frameworks deutlich einfacher, da Sie Task- und Task<TResult>-Objekte erstellen können, die asynchrone Aufgaben auf Threads aus dem Threadpool ausführen.Use of the thread pool is significantly easier in Framework 4 and later, since you can create Task and Task<TResult> objects that perform asynchronous tasks on thread pool threads.

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..NET uses thread pool threads for many purposes, including Task Parallel Library (TPL) operations, asynchronous I/O completion, timer callbacks, registered wait operations, asynchronous method calls using delegates, and System.Net socket connections.

Eigenschaften von ThreadpoolsThread pool characteristics

Threadpoolthreads sind Hintergrundthreads.Thread pool threads are background threads. Jeder Thread verwendet die standardmäßige Stapelgröße, wird mit Standardpriorität ausgeführt und befindet sich im Multithread-Apartment.Each thread uses the default stack size, runs at the default priority, and is in the multithreaded apartment. Sobald ein Thread im Threadpool seine Aufgabe abgeschlossen hat, wird er an eine Warteschlange von Threads zurückgegeben.Once a thread in the thread pool completes its task, it's returned to a queue of waiting threads. Ab diesem Zeitpunkt kann er wiederverwendet werden.From this moment it can be reused. Aufgrund der Wiederverwendung müssen Anwendungen nicht für jede Aufgabe einen neuen Threads erstellen.This reuse enables applications to avoid the cost of creating a new thread for each task.

Pro Prozess gibt es nur einen Threadpool.There is only one thread pool per process.

Ausnahmen in ThreadpoolthreadsExceptions in thread pool threads

Nicht behandelte Ausnahmen in Threadpoolthreads beenden den Prozess.Unhandled exceptions in thread pool threads terminate the process. Für diese Regel gelten jedoch die folgenden drei Ausnahmen:There are three exceptions to this rule:

Weitere Informationen finden Sie unter Ausnahmen in verwalteten Threads.For more information, see Exceptions in Managed Threads.

Maximale Anzahl von Threads im ThreadpoolMaximum number of thread pool threads

Die Anzahl von Vorgängen, die im Threadpool angereiht werden kann, wird nur durch den verfügbaren Arbeitsspeicher beschränkt.The number of operations that can be queued to the thread pool is limited only by available memory. Allerdings schränkt der Threadpool die Anzahl von Threads ein, die gleichzeitig im Prozess aktiv sein können.However, the thread pool limits the number of threads that can be active in the process simultaneously. Wenn alle Threadpoolthreads aktiv sind, werden zusätzliche Arbeitselemente eingereiht, bis Threads verfügbar sind, um diese auszuführen.If all thread pool threads are busy, additional work items are queued until threads to execute them become available. Ab .NET Framework 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.Beginning with the .NET Framework 4, the default size of the thread pool for a process depends on several factors, such as the size of the virtual address space. Ein Prozess kann die ThreadPool.GetMaxThreads-Methode aufrufen, um die Anzahl der Threads zu bestimmen. A process can call the ThreadPool.GetMaxThreads method to determine the number of threads.

Sie können die maximale Anzahl von Threads mithilfe der ThreadPool.GetMaxThreads-Methode und der ThreadPool.SetMaxThreads-Methode steuern. You can control the maximum number of threads by using the ThreadPool.GetMaxThreads and ThreadPool.SetMaxThreads methods.

Hinweis

Code, der die Common Language Runtime hostet, kann die Größe mithilfe der ICorThreadpool::CorSetMaxThreads-Methode festlegen.Code that hosts the common language runtime can set the size using the ICorThreadpool::CorSetMaxThreads method.

Mindestwerte für den ThreadpoolThread pool minimums

Der Threadpool stellt bei Bedarf neue Arbeitsthreads oder E/A-Abschlussthreads bereit, bis ein angegebener Mindestwert für jede Kategorie erreicht ist.The thread pool provides new worker threads or I/O completion threads on demand until it reaches a specified minimum for each category. Sie können die ThreadPool.GetMinThreads-Methode verwenden, um diese Mindestwerte abzurufen. You can use the ThreadPool.GetMinThreads method to obtain these minimum values.

Hinweis

Wenn die Anforderungen niedrig sind, kann die tatsächliche Anzahl der Threads im Threadpool unterhalb der Mindestwerte liegen.When demand is low, the actual number of thread pool threads can fall below the minimum values.

Wenn ein Minimum erreicht wird, kann der Threadpool weitere Threads erstellen oder warten, bis einige Aufgaben abgeschlossen sind.When a minimum is reached, the thread pool can create additional threads or wait until some tasks complete. 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.Beginning with the .NET Framework 4, the thread pool creates and destroys worker threads in order to optimize throughput, which is defined as the number of tasks that complete per unit of time. Bei zu wenigen Threads werden die verfügbaren Ressourcen möglicherweise nicht optimal genutzt, wohingegen bei zu vielen Threads Ressourcenkonflikte auftreten können. Too few threads might not make optimal use of available resources, whereas too many threads could increase resource contention.

Achtung

Sie können die ThreadPool.SetMinThreads-Methode verwenden, um die Mindestanzahl an Threads im Leerlauf zu erhöhen.You can use the ThreadPool.SetMinThreads method to increase the minimum number of idle threads. Allerdings kann ein unnötiges Erhöhen dieses Wertes zu Leistungsproblemen führen.However, unnecessarily increasing these values can cause performance problems. Wenn zu viele Aufgaben gleichzeitig gestartet werden, werden möglicherweise alle Aufgaben zu langsam ausgeführt.If too many tasks start at the same time, all of them might appear to be slow. In den meisten Fällen erreicht der Threadpool mit dem eigenen Algorithmus für die Zuordnung von Threads eine bessere Leistung.In most cases the thread pool will perform better with its own algorithm for allocating threads.

Verwenden des ThreadpoolsUsing the thread pool

Ab .NET Framework 4 kann der Threadpool am einfachsten über die Task Parallel Library (TPL) verwendet werden.Beginning with the .NET Framework 4, the easiest way to use the thread pool is to use the Task Parallel Library (TPL). Standardmäßig verwenden TPL-Typen wie Task und Task<TResult> Threadpoolthreads, um Aufgaben auszuführen.By default, TPL types like Task and Task<TResult> use thread pool threads to run tasks.

Sie können den Threadpool auch verwenden, indem Sie in verwaltetem Code ThreadPool.QueueUserWorkItem aufrufen (oder ICorThreadpool::CorQueueUserWorkItem in nicht verwaltetem Code) und einen System.Threading.WaitCallback-Delegaten übergeben, der die Methode darstellt, die die Aufgabe ausführt.You can also use the thread pool by calling ThreadPool.QueueUserWorkItem from managed code (or ICorThreadpool::CorQueueUserWorkItem from unmanaged code) and passing a System.Threading.WaitCallback delegate representing the method that performs the task.

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.Another way to use the thread pool is to queue work items that are related to a wait operation by using the ThreadPool.RegisterWaitForSingleObject method and passing a System.Threading.WaitHandle that, when signaled or when timed out, calls the method represented by the System.Threading.WaitOrTimerCallback delegate. Threadpoolthreads werden zum Aufrufen von Rückrufmethoden verwendet. Thread pool threads are used to invoke callback methods.

Beispiele finden Sie auf den referenzierten API-Seiten.For the examples, check the referenced API pages.

Überspringen der SicherheitsüberprüfungenSkipping security checks

Der Threadpool stellt auch die ThreadPool.UnsafeQueueUserWorkItem-Methode und die ThreadPool.UnsafeRegisterWaitForSingleObject-Methode bereit.The thread pool also provides the ThreadPool.UnsafeQueueUserWorkItem and ThreadPool.UnsafeRegisterWaitForSingleObject methods. 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.Use these methods only when you are certain that the caller's stack is irrelevant to any security checks performed during the execution of the queued task. 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.ThreadPool.QueueUserWorkItem and ThreadPool.RegisterWaitForSingleObject both capture the caller's stack, which is merged into the stack of the thread pool thread when the thread begins to execute a task. Wenn eine Sicherheitsüberprüfung erforderlich ist, muss der gesamte Stapel überprüft werden.If a security check is required, the entire stack must be checked. Obwohl die Überprüfung Sicherheit gewährleistet, wird dadurch auch die Leistung beeinträchtigt.Although the check provides safety, it also has a performance cost.

Gründe, die gegen die Verwendung von Threadpools sprechenWhen not to use thread pool threads

In einigen Szenarios ist die Erstellung und Verwaltung eigener Threads der Verwendung von Threadpoolthreads vorzuziehen:There are several scenarios in which it's appropriate to create and manage your own threads instead of using thread pool threads:

  • Sie benötigen einen Vordergrundthread.You require a foreground thread.
  • Sie benötigen einen Thread mit einer bestimmten Priorität.You require a thread to have a particular priority.
  • Es gibt Aufgaben, die den Thread über einen längeren Zeitraum blockieren.You have tasks that cause the thread to block for long periods of time. Da die Anzahl der Threads im Threadpool begrenzt ist, kann eine hohe Anzahl blockierter Threadpoolthreads das Starten von Aufgaben verhindern.The thread pool has a maximum number of threads, so a large number of blocked thread pool threads might prevent tasks from starting.
  • Sie müssen Threads in ein Singlethread-Apartment einfügen.You need to place threads into a single-threaded apartment. Alle ThreadPool-Threads befinden sich im Multithread-Apartment.All ThreadPool threads are in the multithreaded apartment.
  • Dem Thread muss eine stabile Identität zugeordnet werden, oder ein Thread soll einer Aufgabe zugeordnet werden.You need to have a stable identity associated with the thread, or to dedicate a thread to a task.

Siehe auchSee also