Grupo de subprocesos administradoThe managed thread pool

La clase System.Threading.ThreadPool proporciona a la aplicación un grupo de subprocesos de trabajo administrados por el sistema, que le permite concentrarse en las tareas de la aplicación en lugar de en la administración de los subprocesos.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. Si tiene tareas cortas que requieran procesamiento en segundo plano, el grupo de subprocesos administrados permite aprovechar fácilmente las ventajas de varios subprocesos.If you have short tasks that require background processing, the managed thread pool is an easy way to take advantage of multiple threads. El uso del grupo de subprocesos es notablemente más sencilla en .NET Framework 4 y versiones posteriores, ya que puede crear objetos Task y Task<TResult> que realizan tareas asincrónicas en los subprocesos del grupo de subprocesos.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.

.NET usa los subprocesos del grupo de subprocesos para muchos fines, incluidas operaciones de biblioteca TPL, la finalización de E/S asincrónica, las devoluciones de llamada del temporizador, las operaciones de espera registradas, las llamadas de métodos asincrónicos mediante delegados y las conexiones de socket System.Net..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.

Características del grupo de subprocesosThread pool characteristics

Los subprocesos del grupo de subprocesos son subprocesos en segundo plano.Thread pool threads are background threads. Cada subproceso utiliza el tamaño de pila predeterminado, se ejecuta con la prioridad predeterminada y está en el contenedor multiproceso.Each thread uses the default stack size, runs at the default priority, and is in the multithreaded apartment. Una vez que un subproceso del grupo de subprocesos finaliza su tarea, se devuelve a una cola de subprocesos en espera.Once a thread in the thread pool completes its task, it's returned to a queue of waiting threads. Desde este momento se puede reutilizar.From this moment it can be reused. Esta reutilización permite que las aplicaciones eviten el costo que significa crear un nuevo subproceso para cada tarea.This reuse enables applications to avoid the cost of creating a new thread for each task.

Hay solo un grupo de subprocesos por cada proceso.There is only one thread pool per process.

Excepciones en los subprocesos del grupo de subprocesosExceptions in thread pool threads

Las excepciones no controladas en los subprocesos del grupo de subprocesos finalizan el proceso.Unhandled exceptions in thread pool threads terminate the process. Hay tres excepciones de esta regla:There are three exceptions to this rule:

Para más información, consulte Excepciones en subprocesos administrados.For more information, see Exceptions in Managed Threads.

Número máximo de subprocesos del grupo de subprocesosMaximum number of thread pool threads

El número de operaciones que se pueden poner en cola en el grupo de subprocesos está limitado únicamente por la memoria disponible.The number of operations that can be queued to the thread pool is limited only by available memory. Sin embargo, el grupo de subprocesos limita el número de subprocesos que pueden estar activos en el proceso de forma simultánea.However, the thread pool limits the number of threads that can be active in the process simultaneously. Si todos los subprocesos del grupo de subprocesos están ocupados, los elementos de trabajo adicionales se pondrán en cola hasta que estén disponibles subprocesos para ejecutarlos.If all thread pool threads are busy, additional work items are queued until threads to execute them become available. A partir de .NET Framework 4, el tamaño predeterminado del grupo de subprocesos de un proceso depende de varios factores, como el tamaño del espacio de direcciones virtuales.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. Un proceso puede llamar al método ThreadPool.GetMaxThreads para determinar el número de subprocesos.A process can call the ThreadPool.GetMaxThreads method to determine the number of threads.

El número máximo de subprocesos se puede controlar con los métodos ThreadPool.GetMaxThreads y ThreadPool.SetMaxThreads.You can control the maximum number of threads by using the ThreadPool.GetMaxThreads and ThreadPool.SetMaxThreads methods.

Nota

El código que hospeda Common Language Runtime puede establecer el tamaño con el método ICorThreadpool::CorSetMaxThreads.Code that hosts the common language runtime can set the size using the ICorThreadpool::CorSetMaxThreads method.

Mínimos del grupo de subprocesosThread pool minimums

El grupo de subprocesos ofrece nuevos subprocesos de trabajo o subprocesos de finalización de E/S a petición hasta que llega a un mínimo especificado para cada categoría.The thread pool provides new worker threads or I/O completion threads on demand until it reaches a specified minimum for each category. Puede utilizar el método ThreadPool.GetMinThreads para obtener estos valores mínimos.You can use the ThreadPool.GetMinThreads method to obtain these minimum values.

Nota

Cuando la demanda es baja, el número real de subprocesos del grupo de subprocesos puede descender por debajo de los valores mínimos.When demand is low, the actual number of thread pool threads can fall below the minimum values.

Cuando se alcanza el mínimo, el grupo de subprocesos puede crear subprocesos adicionales o esperar hasta que se completen algunas tareas.When a minimum is reached, the thread pool can create additional threads or wait until some tasks complete. A partir de .NET Framework 4, el grupo de subprocesos crea y destruye subprocesos de trabajo para optimizar el rendimiento, definido como el número de tareas que se completan por unidad de tiempo.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. Si hay demasiados pocos subprocesos, puede que los recursos disponibles no se usen de manera óptima, mientras que si hay demasiados subprocesos, puede aumentar la contención de recursos.Too few threads might not make optimal use of available resources, whereas too many threads could increase resource contention.

Precaución

Puede utilizar el método ThreadPool.SetMinThreads para aumentar el número mínimo de subprocesos inactivos.You can use the ThreadPool.SetMinThreads method to increase the minimum number of idle threads. Sin embargo, aumentar innecesariamente estos valores puede causar problemas de rendimiento.However, unnecessarily increasing these values can cause performance problems. Si se inician demasiadas tareas al mismo tiempo, puede que todas ellas parezcan funcionar con lentitud.If too many tasks start at the same time, all of them might appear to be slow. En la mayoría de los casos, el grupo de subprocesos funciona mejor con su propio algoritmo de asignación de subprocesos.In most cases the thread pool will perform better with its own algorithm for allocating threads.

Uso del grupo de subprocesosUsing the thread pool

A partir de .NET Framework 4, la manera más fácil de usar el grupo de subprocesos es utilizar la Biblioteca TPL.Beginning with the .NET Framework 4, the easiest way to use the thread pool is to use the Task Parallel Library (TPL). De forma predeterminada, los tipos de biblioteca TPL, como Task y Task<TResult>, usan subprocesos del grupo de subprocesos para ejecutar tareas.By default, TPL types like Task and Task<TResult> use thread pool threads to run tasks.

También puede utilizar el grupo de subprocesos llamando a ThreadPool.QueueUserWorkItem desde código administrado (o ICorThreadpool::CorQueueUserWorkItem desde código no administrado) y pasando un delegado System.Threading.WaitCallback que represente al método que realiza la tarea.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.

Otra forma de usar el grupo de subprocesos es poner en cola los elementos de trabajo que están relacionados con una operación de espera mediante el método ThreadPool.RegisterWaitForSingleObject y pasar un System.Threading.WaitHandle que, cuando se señala o cuando se agota el tiempo de espera, llame al método representado por el delegado System.Threading.WaitOrTimerCallback.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. Los subprocesos del grupo de subprocesos se usan para invocar métodos de devolución de llamada.Thread pool threads are used to invoke callback methods.

Para ver los ejemplos, consulte las páginas de la API a la que se hace referencia.For the examples, check the referenced API pages.

Omisión de comprobaciones de seguridadSkipping security checks

El grupo de subprocesos también proporciona los métodos ThreadPool.UnsafeQueueUserWorkItem y ThreadPool.UnsafeRegisterWaitForSingleObject.The thread pool also provides the ThreadPool.UnsafeQueueUserWorkItem and ThreadPool.UnsafeRegisterWaitForSingleObject methods. Utilice estos métodos solamente cuando tenga la seguridad de que la pila del llamador es irrelevante para las comprobaciones de seguridad que se realizan durante la ejecución de la tarea en cola.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 y ThreadPool.RegisterWaitForSingleObject capturan la pila del llamador, que se combina en la pila del subproceso del grupo de subprocesos cuando el subproceso empieza a ejecutar una tarea.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. Si es necesaria una comprobación de seguridad, debe comprobarse toda la pila.If a security check is required, the entire stack must be checked. La comprobación proporciona seguridad, pero también supone un coste para el rendimiento.Although the check provides safety, it also has a performance cost.

Cuándo no usar subprocesos del grupo de subprocesosWhen not to use thread pool threads

Hay varios escenarios en los que es adecuado crear y administrar sus propios subprocesos en lugar de utilizar subprocesos del grupo de subprocesos:There are several scenarios in which it's appropriate to create and manage your own threads instead of using thread pool threads:

  • Necesita un subproceso en primer plano.You require a foreground thread.
  • Necesita que un subproceso tenga una prioridad determinada.You require a thread to have a particular priority.
  • Tiene tareas que hacen que el subproceso se bloquee durante largos períodos de tiempo.You have tasks that cause the thread to block for long periods of time. El grupo de subprocesos tiene un número máximo de subprocesos, por lo que si hay un gran número de subprocesos del grupo de subprocesos bloqueados, esto puede impedir que se inicien las tareas.The thread pool has a maximum number of threads, so a large number of blocked thread pool threads might prevent tasks from starting.
  • Debe colocar los subprocesos en un contenedor uniproceso.You need to place threads into a single-threaded apartment. Todos los subprocesos ThreadPool están en el contenedor multiproceso.All ThreadPool threads are in the multithreaded apartment.
  • Debe tener una identidad estable asociada al subproceso o dedicar un subproceso a una tarea.You need to have a stable identity associated with the thread, or to dedicate a thread to a task.

Vea tambiénSee also