ThreadPool Clase
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Proporciona un grupo de subprocesos que se pueden usar para ejecutar tareas, publicar elementos de trabajo, procesar E/S asincrónica, esperar en nombre de otros subprocesos y temporizadores de proceso.
public ref class ThreadPool sealed
public ref class ThreadPool abstract sealed
public sealed class ThreadPool
public static class ThreadPool
type ThreadPool = class
Public NotInheritable Class ThreadPool
Public Class ThreadPool
- Herencia
-
ThreadPool
Ejemplos
En el ejemplo siguiente, el subproceso de aplicación principal pone en cola un método denominado ThreadProc para ejecutarse en un subproceso del grupo de subprocesos, se suspende durante un segundo y, a continuación, se cierra. El ThreadProc método simplemente muestra un mensaje.
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.
Si comenta la llamada al Thread.Sleep método , el subproceso principal sale antes de que el método se ejecute en el subproceso del grupo de subprocesos. El grupo de subprocesos usa subprocesos en segundo plano, que no mantienen la aplicación en ejecución si todos los subprocesos en primer plano han finalizado. (Este es un ejemplo sencillo de una condición de carrera).
Comentarios
Muchas aplicaciones crean subprocesos que pasan mucho tiempo en estado de suspensión, esperando a que se produzca un evento. Otros subprocesos pueden introducir un estado de suspensión solo para despertarse periódicamente para sondear una información de estado de cambio o actualización. El grupo de subprocesos permite usar subprocesos de forma más eficaz al proporcionar a la aplicación un grupo de subprocesos de trabajo administrados por el sistema. Entre los ejemplos de operaciones que usan subprocesos del grupo de subprocesos se incluyen los siguientes:
Cuando se crea un Task objeto o Task<TResult> para realizar alguna tarea de forma asincrónica, de forma predeterminada la tarea está programada para ejecutarse en un subproceso del grupo de subprocesos.
Los temporizadores asincrónicos usan el grupo de subprocesos. Los subprocesos del grupo de subprocesos ejecutan devoluciones de llamada de la System.Threading.Timer clase y generan eventos de la System.Timers.Timer clase .
Cuando se usan identificadores de espera registrados, un subproceso del sistema supervisa el estado de los identificadores de espera. Cuando se completa una operación de espera, un subproceso de trabajo del grupo de subprocesos ejecuta la función de devolución de llamada correspondiente.
Cuando se llama al QueueUserWorkItem método para poner en cola un método para su ejecución en un subproceso de grupo de subprocesos. Para ello, pase el método un WaitCallback delegado. El delegado tiene la firma
void WaitCallback(Object state)Sub WaitCallback(state As Object)donde
statees un objeto que contiene los datos que va a usar el delegado. Los datos reales se pueden pasar al delegado llamando al QueueUserWorkItem(WaitCallback, Object) método .
Note
Los subprocesos del grupo de subprocesos administrados son subprocesos en segundo plano. Es decir, sus IsBackground propiedades son true. Esto significa que un ThreadPool subproceso no mantendrá una aplicación en ejecución después de que se hayan cerrado todos los subprocesos en primer plano.
Importante
Cuando el grupo de subprocesos reutiliza un subproceso, no borra los datos en el almacenamiento local del subproceso o en campos marcados con el ThreadStaticAttribute atributo . Por lo tanto, cuando un método examina el almacenamiento local del subproceso o los campos marcados con el ThreadStaticAttribute atributo , los valores que encuentra pueden dejarse de usar anteriormente el subproceso del grupo de subprocesos.
También puede poner en cola los elementos de trabajo que no están relacionados con una operación de espera al grupo de subprocesos. Para solicitar que un subproceso del grupo de subprocesos controle un elemento de trabajo, llame al QueueUserWorkItem método . Este método toma como parámetro una referencia al método o delegado al que llamará el subproceso seleccionado en el grupo de subprocesos. No hay ninguna manera de cancelar un elemento de trabajo después de que se haya puesto en cola.
Los temporizadores de cola de temporizador y las operaciones de espera registradas también usan el grupo de subprocesos. Sus funciones de devolución de llamada se ponen en cola en el grupo de subprocesos.
Hay un grupo de subprocesos por proceso. A partir del .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 virtual. Un proceso puede llamar al GetMaxThreads método para determinar el número de subprocesos. El número de subprocesos del grupo de subprocesos se puede cambiar mediante el SetMaxThreads método . Cada subproceso usa el tamaño de pila predeterminado y se ejecuta con la prioridad predeterminada.
Note
El código no administrado que hospeda .NET Framework puede cambiar el tamaño del grupo de subprocesos mediante la función />
El grupo de subprocesos proporciona nuevos subprocesos de trabajo o subprocesos de finalización de E/S a petición hasta que alcanza el máximo para cada categoría. Cuando se alcanza un máximo, el grupo de subprocesos puede crear subprocesos adicionales en esa categoría o esperar hasta que se completen algunas tareas. A partir de .NET Framework 4, el grupo de subprocesos crea y destruye subprocesos de trabajo para optimizar el rendimiento, que se define como el número de tareas que se completan por unidad de tiempo. Es posible que demasiados subprocesos no hagan un uso óptimo de los recursos disponibles, mientras que demasiados subprocesos podrían aumentar la contención de recursos.
Note
Cuando la demanda es baja, el número real de subprocesos del grupo de subprocesos puede descender por debajo de los valores mínimos.
Puede usar el GetMinThreads método para obtener estos valores mínimos.
Caution
Puede usar el SetMinThreads método para aumentar el número mínimo de subprocesos. Sin embargo, aumentar innecesariamente estos valores puede causar problemas de rendimiento. Si se inician demasiadas tareas al mismo tiempo, es posible que todas parezcan lentas. En la mayoría de los casos, el grupo de subprocesos funciona mejor con su propio algoritmo de asignación de subprocesos.
Métodos
| Nombre | Description |
|---|---|
| BindHandle(IntPtr) |
Obsoletos.
Enlaza un identificador de sistema operativo a .ThreadPool |
| BindHandle(SafeHandle) |
Enlaza un identificador de sistema operativo a .ThreadPool |
| GetAvailableThreads(Int32, Int32) |
Recupera la diferencia entre el número máximo de subprocesos de grupo de subprocesos devueltos por el GetMaxThreads(Int32, Int32) método y el número activo actualmente. |
| GetMaxThreads(Int32, Int32) |
Recupera el número de solicitudes al grupo de subprocesos que se pueden activar simultáneamente. Todas las solicitudes anteriores a ese número permanecen en cola hasta que los subprocesos del grupo de subprocesos estén disponibles. |
| GetMinThreads(Int32, Int32) |
Recupera el número mínimo de subprocesos que el grupo de subprocesos crea a petición, a medida que se realizan nuevas solicitudes, antes de cambiar a un algoritmo para administrar la creación y destrucción del subproceso. |
| QueueUserWorkItem(WaitCallback, Object) |
Pone en cola un método para su ejecución y especifica un objeto que contiene datos que va a usar el método . El método se ejecuta cuando un subproceso del grupo de subprocesos está disponible. |
| QueueUserWorkItem(WaitCallback) |
Pone en cola un método para su ejecución. El método se ejecuta cuando un subproceso del grupo de subprocesos está disponible. |
| QueueUserWorkItem<TState>(Action<TState>, TState, Boolean) |
Pone en cola un método especificado por un Action<T> delegado para su ejecución y proporciona datos que el método va a usar. El método se ejecuta cuando un subproceso del grupo de subprocesos está disponible. |
| RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) |
Registra un delegado para esperar un WaitHandle, especificando un entero de 32 bits con signo para el tiempo de espera en milisegundos. |
| RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) |
Registra un delegado para esperar un WaitHandle, especificando un entero de 64 bits con signo para el tiempo de espera en milisegundos. |
| RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) |
Registra un delegado para esperar WaitHandleun , especificando un TimeSpan valor para el tiempo de espera. |
| RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) |
Registra un delegado para esperar un WaitHandle, especificando un entero de 32 bits sin signo para el tiempo de espera en milisegundos. |
| SetMaxThreads(Int32, Int32) |
Establece el número de solicitudes en el grupo de subprocesos que pueden estar activos simultáneamente. Todas las solicitudes anteriores a ese número permanecen en cola hasta que los subprocesos del grupo de subprocesos estén disponibles. |
| SetMinThreads(Int32, Int32) |
Establece el número mínimo de subprocesos que el grupo de subprocesos crea a petición, a medida que se realizan nuevas solicitudes, antes de cambiar a un algoritmo para administrar la creación y destrucción del subproceso. |
| UnsafeQueueNativeOverlapped(NativeOverlapped*) |
Pone en cola una operación de E/S superpuesta para su ejecución. |
| UnsafeQueueUserWorkItem(WaitCallback, Object) |
Pone en cola el delegado especificado en el grupo de subprocesos, pero no propaga la pila de llamadas al subproceso de trabajo. |
| UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) |
Registra un delegado para esperar a un WaitHandle, utilizando un entero de 32 bits con signo para el tiempo de espera en milisegundos. Este método no propaga la pila de llamadas al subproceso de trabajo. |
| UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) |
Registra un delegado para esperar un WaitHandle, especificando un entero de 64 bits con signo para el tiempo de espera en milisegundos. Este método no propaga la pila de llamadas al subproceso de trabajo. |
| UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) |
Registra un delegado para esperar WaitHandleun , especificando un TimeSpan valor para el tiempo de espera. Este método no propaga la pila de llamadas al subproceso de trabajo. |
| UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) |
Registra un delegado para esperar un WaitHandle, especificando un entero de 32 bits sin signo para el tiempo de espera en milisegundos. Este método no propaga la pila de llamadas al subproceso de trabajo. |
Se aplica a
Seguridad para subprocesos
Este tipo es seguro para subprocesos.