Pregunta

En .Net4, Monitor.Enter (Objeto) está marcado como obsoleto:

[ObsoleteAttribute("This method does not allow its caller to reliably release the lock.  Please use an overload with a lockTaken argument instead.")]
public static void Enter(
    Object obj
)

Y hay un nuevo método Monitor.Enter ( lockObject, adquiridoLock) con este uso:

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);
    }
}

Solía ??hacerlo de esta manera:

Monitor.Enter(lockObject);
try
{

    // Code that accesses resources that are protected by the lock.
}
finally
{
    Monitor.Exit(lockObject);
}

¿Está mal? Por qué ? Tal vez con una interrupción después de la entrada pero antes del intento?
Como preguntó Eamon Nerbonne: ¿qué sucede si hay una excepción asíncrona en el último momento justo antes de monitor.exit?

Respuesta: ThreadAbortException

  

Cuando se levanta esta excepción, la   el tiempo de ejecución ejecuta todo el finalmente   Bloques antes de terminar el hilo.

¿Fue útil?

Solución

Como sugiere justo al final de la pregunta, el problema es que excepción asíncrona se podría lanzar después de la llamada a Monitor.Enter pero antes de ingresar al try .

La nueva forma de hacer las cosas se asegura de que pase lo que pase, llegue al último bloque y podrá liberar el bloqueo si lo adquirió. (No puede adquirirlo si Monitor.Enter lanza una excepción, por ejemplo).

IIRC, este es el nuevo comportamiento de la palabra clave lock cuando se dirige a .NET 4.0.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top