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

 

Intenta, durante el número especificado de milisegundos, adquirir 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 TryEnter(
	object obj,
	int millisecondsTimeout,
	ref bool lockTaken
)

Parámetros

obj
Type: System.Object

Objeto en el que se va a adquirir el bloqueo.

millisecondsTimeout
Type: System.Int32

Número de milisegundos durante los que se va a esperar para adquirir el bloqueo.

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.

Exception Condition
ArgumentException

La entrada a lockTaken es true.

ArgumentNullException

El parámetro obj es null.

ArgumentOutOfRangeException

millisecondsTimeout es negativo y no es igual a Infinite.

Si el millisecondsTimeout parámetro es igual a Infinite, este método es equivalente a Enter(Object). Si millisecondsTimeout es igual a 0, este método es equivalente a TryEnter(Object).

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.

System_CAPS_noteNota

Use Monitor para bloquear objetos (es decir, tipos de referencia), no tipos de valor. Para obtener más información, consulte el Monitor tema de la clase.

Para asegurarse de que el subproceso no entra en la sección crítica, debe examinar el valor de lockTaken y ejecutar el código en la sección crítica solo si su valor es true. El siguiente fragmento de código muestra la trama usada para llamar a este método. Tenga en cuenta que debe llamar a Exit en un finally bloque para asegurarse de que el subproceso que realiza la llamada libera el bloqueo en la sección crítica, si se produce una excepción.

var lockObj = new Object();
int timeout = 500;
bool lockTaken = false;

try {
   Monitor.TryEnter(lockObj, timeout, ref lockTaken);
   if (lockTaken) {
      // The critical section.
   }
   else {
      // The lock was not acquired.
   }
}
finally {
   // Ensure that the lock is released.
   if (lockTaken) {
      Monitor.Exit(lockObj);
   }   
}

El código siguiente muestra el patrón básico para el uso de la TryEnter(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.TryEnter(lockObject, 500, ref acquiredLock);
    if (acquiredLock)
    {

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

    }
    else
    {

        // Code to deal with the fact that the lock was not acquired.

    }
}
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: