Compartir a través de


Pausar y reanudar subprocesos

Actualización: noviembre 2007

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 Thread.Sleep, el subproceso actual se bloquea inmediatamente durante el número de milisegundos que se pasen a Thread.Sleep y el resto de su espacio de tiempo se asigna a otro subproceso. Un subproceso no puede llamar a Thread.Sleep en otro subproceso.

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

Interrumpir subprocesos

Puede interrumpir un subproceso en espera llamando a 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 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, Thread.Interrupt y 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 Thread.Interrupt ni 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:

Suspender y reanudar (obsoleto)

Nota importante:

En la versión 2.0 de .NET Framework, los métodos Thread.Suspend y 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 Thread.Suspend. Cuando un subproceso llama a Thread.Suspend en sí mismo, la llamada se bloquea hasta que el subproceso es reanudado por otro subproceso. Cuando un subproceso llama a Thread.Suspend en otro subproceso, la llamada no es de bloqueo y hace que el otro subproceso se pause. Al llamar a 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 Thread.Suspend. Por ejemplo, si llama a Thread.Suspendcinco veces consecutivas y, a continuación, llama a Thread.Resume, el subproceso reanuda la ejecución inmediatamente después de llamar a Thread.Resume.

A diferencia de Thread.Sleep, 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.

Nota importante:

Los métodos Thread.Suspend y Thread.Resume no suelen resultar útiles para las aplicaciones y no deben confundirse con mecanismos de sincronización. Puesto que Thread.Suspend y 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 Thread.Suspend.

Vea también

Conceptos

Información general sobre los primitivos de sincronización

Thread.Suspend, recolección de elementos no utilizados y puntos de seguridad

Referencia

Thread

ThreadInterruptedException

ThreadAbortException

Otros recursos

Subprocesamiento administrado

Utilizar subprocesos y subprocesamiento