Uso de subprocesos y subprocesamiento

Con .NET, se pueden escribir aplicaciones que realicen varias operaciones al mismo tiempo. Las operaciones con la posibilidad de contener otras operaciones se pueden ejecutar en subprocesos independientes, lo que se conoce como multithreading o subprocesamiento libre.

Las aplicaciones que usan multithreading responden mejor a la entrada del usuario, ya que la interfaz de usuario permanece activa mientras las tareas que requieren un uso intensivo del procesador se ejecutan en subprocesos separados. El multithreading también es útil cuando se crean aplicaciones escalables porque se pueden agregar subprocesos a medida que aumenta la carga de trabajo.

Nota:

Si necesita más control sobre el comportamiento de los subprocesos de la aplicación, puede administrar los subprocesos por su cuenta. Pero la programación multithreading se ha simplificado significativamente con las clases System.Threading.Tasks.Parallel y System.Threading.Tasks.Task, Parallel LINQ (PLINQ), las clases de colecciones simultáneas del espacio de nombres System.Collections.Concurrent y un modelo de programación basado en el concepto de tareas en lugar de subprocesos. Para obtener más información, vea Programación en paralelo y Biblioteca de procesamiento paralelo basado en tareas (TPL).

Procedimiento para crear e iniciar un subproceso nuevo

Para crear un subproceso nuevo, cree una nueva instancia de la clase System.Threading.Thread. Proporcione el nombre del método que desea ejecutar en el nuevo subproceso al constructor. Para iniciar un subproceso creado, llame al método Thread.Start. Para obtener más información y ejemplos, vea el artículo Creación de subprocesos y análisis de los datos en el inicio y la referencia de la API Thread.

Procedimiento para detener un subproceso

Para terminar la ejecución de un subproceso, use System.Threading.CancellationToken. Proporciona una manera unificada de detener los subprocesos de forma cooperativa. Para más información, consulte Cancelación de subprocesos administrados.

A veces no es posible detener un subproceso de forma cooperativa, ya que ejecuta código de terceros no diseñado para la cancelación cooperativa. En este caso, es posible que desee terminar la ejecución forzosamente. Para terminar la ejecución de un subproceso forzosamente, en .NET Framework puede utilizar el método Thread.Abort. Ese método genera una excepción ThreadAbortException en el subproceso en el que se invoca. Para obtener más información, vea Destruir subprocesos. El método Thread.Abort no se admite en .NET Core. Si necesita terminar la ejecución de código de terceros de forma forzada en .NET Core, ejecútelo en el proceso independiente y use el método Process.Kill.

System.Threading.CancellationToken no está disponible antes de .NET Framework 4. Para detener un subproceso en versiones anteriores de .NET Framework, use las técnicas de sincronización de subprocesos para implementar manualmente la cancelación cooperativa. Por ejemplo, puede crear el campo booleano volatile shouldStop y usarlo para solicitar que se detenga el código ejecutado por el subproceso. Para más información, vea volatile en Referencia de C# y System.Threading.Volatile.

Use el método Thread.Join para hacer que el subproceso que realiza la llamada espere a la finalización del subproceso que se está deteniendo.

Procedimiento para pausar o interrumpir un subproceso

El método Thread.Sleep se usa para pausar el subproceso actual durante un período de tiempo especificado. Un subproceso bloqueado se puede interrumpir mediante una llamada al método Thread.Interrupt. Para obtener más información, vea Pausa e interrupción de subprocesos.

Propiedades de subproceso

En la tabla siguiente se muestran algunas de las propiedades de Thread:

Propiedad. Descripción
IsAlive Devuelve true si un subproceso se ha iniciado y todavía no ha terminado con normalidad o se ha anulado.
IsBackground Obtiene o establece un valor booleano que indica si un subproceso es un subproceso en segundo plano. Los subprocesos en segundo plano son como subprocesos en primer plano. Sin embargo, un subproceso en segundo plano no impide que un proceso se detenga. Una vez que se hayan detenido todos los subprocesos en primer plano que pertenecen a un proceso, Common Language Runtime finaliza el proceso mediante una llamada al método Abort en los subprocesos en segundo plano que continúan activos. Para obtener más información, vea Subprocesos de primer y segundo plano.
Name Obtiene o establece el nombre de un subproceso. Suele usarse para detectar subprocesos individuales durante la depuración.
Priority Obtiene o establece un valor ThreadPriority que el sistema operativo usa para dar prioridad a la programación de subprocesos. Para obtener más información, vea Planear subprocesos y la referencia de ThreadPriority.
ThreadState Obtiene un valor ThreadState que contiene los estados actuales de un subproceso.

Vea también