Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Método Monitor.Wait (Object, Int32, Boolean)

 

Publicado: octubre de 2016

Libera el bloqueo en un objeto y bloquea el subproceso actual hasta que vuelve a adquirir el bloqueo. Si transcurre el intervalo de tiempo de espera especificado, el subproceso entra en la cola de subprocesos listos. Este método también especifica si el dominio de sincronización del contexto (si se trata de un contexto sincronizado) sale antes de la espera y vuelve a adquirir el bloqueo después.

Espacio de nombres:   System.Threading
Ensamblado:  mscorlib (en mscorlib.dll)

public static bool Wait(
	object obj,
	int millisecondsTimeout,
	bool exitContext
)

Parámetros

obj
Type: System.Object

Objeto en el que se va a esperar.

millisecondsTimeout
Type: System.Int32

Número de milisegundos que se va a estar a la espera antes de que el subproceso entre en la cola de subprocesos listos.

exitContext
Type: System.Boolean

true para abandonar y volver a adquirir el dominio de sincronización para el contexto (en caso de encontrarse en un contexto sincronizado) antes de que transcurra la espera; en caso contrario, false.

Valor devuelto

Type: System.Boolean

Es true si se volvió a adquirir el bloqueo antes de que transcurriera el período de tiempo especificado; es false si se volvió a adquirir el bloqueo después de que transcurriera el período de tiempo especificado. El método no devuelve ningún resultado hasta que se vuelva a adquirir el bloqueo.

Exception Condition
ArgumentNullException

El parámetro obj es null.

SynchronizationLockException

Wait no se invoca desde dentro de un bloque de código sincronizado.

ThreadInterruptedException

El subproceso que invoca Wait se interrumpe más adelante desde el estado de espera. Esto ocurre cuando otro subproceso llame a este subproceso Interrupt método.

ArgumentOutOfRangeException

El valor de la millisecondsTimeout parámetro es negativo y no es igual a Infinite.

Este método no vuelve hasta que vuelve a adquirir un bloqueo exclusivo en el obj parámetro.

El subproceso que actualmente posee el bloqueo en el objeto especificado invoca a este método para liberar el objeto para que otro subproceso puede obtener acceso a él. El autor de la llamada se bloquea mientras espera a adquirir el bloqueo. Se llama a este método cuando el llamador tiene que esperar un cambio de estado que se producirá como resultado de operaciones de otro subproceso.

El tiempo de espera garantiza que el subproceso actual no se bloquea indefinidamente si otro subproceso libera el bloqueo sin llamar primero a la Pulse o PulseAll (método). También desplaza el subproceso a la cola de subprocesos listos, pasando por alto otros subprocesos que estén antes en la cola de espera, por lo que puede volver a adquirir el bloqueo antes. El subproceso puede probar el valor devuelto de la Wait método para determinar si volvió a adquirir el bloqueo antes del tiempo de espera. El subproceso puede evaluar las condiciones que han producido que entre en espera, y si es necesario llamada la Wait nuevo al método.

Cuando un subproceso llama Wait, libera el bloqueo y entra en la cola de espera. En este punto, el siguiente subproceso de la cola de subprocesos listos (si hay alguno) puede tomar el control del bloqueo. El subproceso que invocó Wait permanece en la cola de espera hasta que un subproceso que retiene el bloqueo invoca PulseAll, o sea el siguiente en la cola y se invoca en un subproceso que retiene el bloqueo Pulse. Sin embargo, si millisecondsTimeout transcurre antes de que otro subproceso llama a este objeto Pulse o PulseAll (método), el subproceso original se mueve a la cola de subprocesos listos para volver a adquirir el bloqueo.

System_CAPS_noteNota

Si Infinite se especifica para el millisecondsTimeout parámetro, este método se bloquea indefinidamente a menos que el propietario del bloqueo llame Pulse o PulseAll. Si millisecondsTimeout es igual a 0, el subproceso que llama Wait libera el bloqueo e inmediatamente después entra en la cola de subprocesos listos para volver a adquirir el bloqueo.

El llamador ejecuta Wait una vez, independientemente del número de veces que Enter se ha invocado para el objeto especificado. Conceptualmente, el Wait método almacena el número de veces que el llamador ha invocado Enter en el objeto e invoca Exit tantas veces como sea necesario para liberar completamente el objeto bloqueado. El llamador, a continuación, se bloquea mientras espera para adquirir el objeto. Cuando el llamador vuelve a adquirir el bloqueo, el sistema llama Enter tantas veces como sea necesario para restaurar el guardado Enter recuento para el llamador. Llamar a Wait libera el bloqueo para el objeto especificado; si el llamador es el propietario de los bloqueos sobre otros objetos, estos bloqueos no se liberan.

System_CAPS_noteNota

Un objeto sincronizado contiene varias referencias, incluida una referencia al subproceso que actualmente posee el bloqueo, una referencia a la cola de subprocesos listos, que contiene los subprocesos que están listos para obtener el bloqueo, y una referencia a la cola de espera, que contiene los subprocesos que están esperando la notificación de un cambio en el estado del objeto.

El Pulse, PulseAll, y Wait métodos deben invocarse desde dentro de un bloque de código sincronizado.

La sección Comentarios para el Pulse método explica qué ocurre si Pulse se llama cuando no hay ningún subproceso en espera.

ElexitContext parámetro no tiene ningún efecto a menos que el Wait método se llama desde dentro de un contexto administrado no predeterminado. Esto puede suceder si el subproceso está dentro de una llamada a una instancia de una clase derivada de ContextBoundObject. Aunque esté ejecutando un método en una clase que no se derive de ContextBoundObject, como String, puede estar en un contexto no predeterminado si un ContextBoundObject en la pila en el dominio de aplicación actual.

Cuando el código se ejecuta en un contexto no predeterminado, especificar true para exitContext hace que el subproceso salga del contexto administrado no predeterminado (es decir, que pase al contexto predeterminado) antes de ejecutar el Wait método. Se devuelve al contexto no predeterminado original después de la llamada a la Wait método se completa.

Esto puede ser útil cuando la clase enlazada de contexto tiene la SynchronizationAttribute atributo aplicado. En ese caso, todas las llamadas a miembros de la clase se sincronizan automáticamente y el dominio de sincronización es todo el cuerpo de código para la clase. Si el código de la pila de llamadas de un miembro llama el Wait (método) y especifica true para exitContext, el subproceso saldrá del dominio de sincronización, que permite que un subproceso que esté bloqueado en una llamada a cualquier miembro del objeto para continuar. Cuando el Wait devuelve el método, el subproceso que realiza la llamada debe esperar para volver a escribir el dominio de sincronización.

.NET Framework
Disponible desde 1.1
Volver al principio
Mostrar: