.Net4, Monitor.Enter (lockObject, adquiridoLock)
-
06-07-2019 - |
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.
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.