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, TimeSpan)

 

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.

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

public static bool Wait(
	object obj,
	TimeSpan timeout
)

Parámetros

obj
Type: System.Object

Objeto en el que se va a esperar.

timeout
Type: System.TimeSpan

TimeSpan que representa la cantidad de tiempo que se va a esperar antes de que el subproceso entre en la cola de subprocesos listos.

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

El subproceso de llamada no posee el bloqueo para el objeto especificado.

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 timeout parámetro en milisegundos es negativo y no representa Infinite (– 1 milisegundo), o es mayor que MaxValue.

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 en el objeto y entra en cola de espera del objeto. El siguiente subproceso de cola de subprocesos listos del objeto (si hay alguno) adquiere el bloqueo y tiene uso exclusivo del objeto. 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 timeout 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 un TimeSpan que representa-1 milisegundo se especifica para el timeout parámetro, este método se bloquea indefinidamente a menos que el propietario del bloqueo llame Pulse o PulseAll. Si timeout es 0 milisegundos, 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.

Plataforma universal de Windows
Disponible desde 8
.NET Framework
Disponible desde 1.1
Biblioteca de clases portable
Se admite en: plataformas portátiles de .NET
Silverlight
Disponible desde 2.0
Windows Phone Silverlight
Disponible desde 7.0
Windows Phone
Disponible desde 8.1
Volver al principio
Mostrar: