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.Enter (Object, Boolean)

 

Adquiere un bloqueo exclusivo en el objeto especificado y establece de forma atómica un valor que indica si se realizó el bloqueo.

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

public static void Enter(
	object obj,
	ref bool lockTaken
)

Parámetros

obj
Type: System.Object

Objeto en el que se va a esperar.

lockTaken
Type: System.Boolean

Resultado del intento de adquirir el bloqueo, pasado por referencia. La entrada debe ser false. El resultado es true si se adquiere el bloqueo; en caso contrario, el resultado es false. El resultado se establece aunque se produzca una excepción durante el intento de adquirir el bloqueo.

Nota   Si no se produce ninguna excepción, el resultado de este método siempre es true.

Exception Condition
ArgumentException

La entrada a lockTaken es true.

ArgumentNullException

El parámetro obj es null.

Use Enter para adquirir el Monitor en el objeto pasado como el obj parámetro. Si otro subproceso ha ejecutado un Enter en el objeto, pero no se ha ejecutado todavía el correspondiente Exit, se bloqueará el subproceso actual hasta que el otro subproceso libera el objeto. Es válido para el mismo subproceso invocar Enter más de una vez sin bloquearse; sin embargo, un número igual de Exit se deben invocar llamadas antes de que se desbloqueen otros subprocesos en espera en el objeto.

Si no se realizó el bloqueo porque se produjo una excepción, la variable especificada para el lockTaken parámetro es false una vez finalizado este método. Esto permite que el programa determinar, en todos los casos, si es necesario liberar el bloqueo. Si este método devuelve sin producir una excepción, la variable especificada para el lockTaken parámetro siempre es true, y no es necesario para probarla.

Use Monitor para bloquear objetos (es decir, tipos de referencia), no tipos de valor. Cuando se pasa una variable de tipo de valor a Enter, es una conversión boxing como objeto. Si se pasa la misma variable a Enter nuevo, es una conversión boxing como objeto independiente y no bloquea el subproceso. En este caso, el código que Monitor es supuestamente protege no está protegido. Además, al pasar la variable a Exit, se crea otro objeto independiente. Puesto que el objeto pasado a Exit es diferente del objeto pasado a Enter, Monitor produce SynchronizationLockException. Para obtener más información, vea el tema conceptual Monitores.

Interruptpuede interrumpir subprocesos que están esperando para escribir un Monitor en un objeto. Un ThreadInterruptedException se iniciará.

El código siguiente muestra el patrón básico para el uso de la Enter(Object, Boolean) sobrecarga del método. Esta sobrecarga siempre establece el valor de la variable que se pasa a la ref parámetro (ByRef en Visual Basic) lockTaken, incluso si el método produce una excepción, por lo que el valor de la variable es una manera fiable para comprobar si tiene el bloqueo se libera.

bool acquiredLock = false;

try
{
    Monitor.Enter(lockObject, ref acquiredLock);

    // Code that accesses resources that are protected by the lock.

}
finally
{
    if (acquiredLock)
    {
        Monitor.Exit(lockObject);
    }
}

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