Pausar y reanudar subprocesos

Las formas más habituales de sincronizar las actividades de los subprocesos consisten en bloquear y liberar los subprocesos o en bloquear objetos o regiones de código. Para obtener más información sobre estos bloqueos y mecanismos de bloqueo, vea Información general sobre los primitivos de sincronización.

También puede hacer que los subprocesos pasen a estar inactivos por sí mismos. Cuando los subprocesos se encuentran bloqueados o inactivos, se puede utilizar ThreadInterruptedException para interrumpir sus estados de espera.

El método Thread.Sleep

Si se llama al método System.Threading.Thread.Sleep, el subproceso actual se bloquea inmediatamente durante el número de milisegundos que se pasen a System.Threading.Thread.Sleep y el resto de su espacio de tiempo se asigna a otro subproceso. Un subproceso no puede llamar a System.Threading.Thread.Sleep en otro subproceso.

Cuando se llama a System.Threading.Thread.Sleep con System.Threading.Timeout.Infinite, un subproceso pasa a un estado de inactividad hasta que lo interrumpe otro subproceso que llama a System.Threading.Thread.Interrupt o hasta que System.Threading.Thread.Abort finaliza dicho subproceso.

Interrumpir subprocesos

Puede interrumpir un subproceso en espera llamando a System.Threading.Thread.Interrupt en el subproceso bloqueado para producir una excepción ThreadInterruptedException, que saca al subproceso de la llamada que lo bloquea. El subproceso debe detectar la excepción ThreadInterruptedException y hacer lo que sea necesario para seguir funcionando. Si el subproceso pasa por alto la excepción, el motor en tiempo de ejecución detecta la excepción y detiene el subproceso.

Nota

Si el subproceso de destino no está bloqueado cuando se llama a System.Threading.Thread.Interrupt, el subproceso no se interrumpe hasta que se bloquea. Si el subproceso no se bloquea nunca, puede finalizar sin ser interrumpido.

Si una espera es de tipo administrado, System.Threading.Thread.Interrupt y System.Threading.Thread.Abort activan el subproceso inmediatamente. Si una espera es de tipo no administrado (por ejemplo, una llamada de invocación de plataforma a la función WaitForSingleObject de Win32), ni System.Threading.Thread.Interrupt ni System.Threading.Thread.Abort pueden tomar el control del subproceso hasta que éste vuelva o llame al código administrado. En código administrado, el comportamiento es el siguiente:

  • System.Threading.Thread.Interrupt activa un subproceso de cualquier tipo de espera y hace que se produzca una excepción ThreadInterruptedException en el subproceso de destino.

  • System.Threading.Thread.Abort es similar a System.Threading.Thread.Interrupt, con la diferencia de que hace que se produzca una excepción ThreadAbortException en el subproceso. Para obtener más detalles, vea Destruir subprocesos.

Suspender y reanudar (obsoleto)

NoteImportante

En la versión 2.0 de .NET Framework, los métodos System.Threading.Thread.Suspend y System.Threading.Thread.Resume están marcados como obsoletos y, en futuras versiones, se quitarán estos métodos.

También puede pausar un subproceso si llama a System.Threading.Thread.Suspend. Cuando un subproceso llama a System.Threading.Thread.Suspend en sí mismo, la llamada se bloquea hasta que el subproceso es reanudado por otro subproceso. Cuando un subproceso llama a System.Threading.Thread.Suspend en otro subproceso, la llamada no es de bloqueo y hace que el otro subproceso se pause. Al llamar a System.Threading.Thread.Resume, otro subproceso sale del estado de suspensión y hace que el subproceso reanude la ejecución, independientemente de cuántas veces se haya llamado a System.Threading.Thread.Suspend. Por ejemplo, si llama a System.Threading.Thread.Suspendcinco veces consecutivas y, a continuación, llama a System.Threading.Thread.Resume, el subproceso reanuda la ejecución inmediatamente después de llamar a System.Threading.Thread.Resume.

A diferencia de System.Threading.Thread.Sleep, System.Threading.Thread.Suspend no hace que un subproceso detenga inmediatamente su ejecución. Common Language Runtime debe esperar hasta que el subproceso alcance un punto de seguridad para poder suspender el subproceso. Un subproceso no se puede suspender si no se ha iniciado o si se ha detenido. Para obtener detalles acerca de puntos de seguridad, vea Thread.Suspend, recolección de elementos no utilizados y puntos de seguridad.

NoteImportante

Los métodos System.Threading.Thread.Suspend y System.Threading.Thread.Resume no suelen resultar útiles para las aplicaciones y no deben confundirse con mecanismos de sincronización. Puesto que System.Threading.Thread.Suspend y System.Threading.Thread.Resume no dependen de la cooperación del subproceso que se está controlando, son muy intrusivos y pueden dar como resultado problemas graves de aplicación como interbloqueos (por ejemplo, si se suspende un subproceso que contiene un recurso que necesitará otro subproceso).

Algunas aplicaciones necesitan controlar la prioridad de los subprocesos para obtener un mayor rendimiento. Para ello, debe utilizar la propiedad Priority en lugar de System.Threading.Thread.Suspend.

Vea también

Referencia

Thread
ThreadInterruptedException
ThreadAbortException

Conceptos

Información general sobre los primitivos de sincronización
Thread.Suspend, recolección de elementos no utilizados y puntos de seguridad

Otros recursos

Subprocesamiento administrado
Utilizar subprocesos y subprocesamiento