.Net4, Monitor.Enter (lockObject, acquisitoLock)
-
06-07-2019 - |
Domanda
In .Net4, Monitor.Enter (Object) è contrassegnato come 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
)
E c'è un nuovo metodo Monitor.Enter ( lockObject, acquisitoLock) con questo utilizzo:
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);
}
}
Lo facevo in questo modo:
Monitor.Enter(lockObject);
try
{
// Code that accesses resources that are protected by the lock.
}
finally
{
Monitor.Exit(lockObject);
}
È sbagliato? Perché ?
Forse con un interruzione dopo l'entrata ma prima del tentativo?
Come ha chiesto Eamon Nerbonne: cosa succede se c'è un'eccezione asincrona nell'ultimo diritto prima di monitor.exit?
Risposta: ThreadAbortException
Quando viene sollevata questa eccezione, il il runtime esegue finalmente tutto blocchi prima di terminare il thread.
Soluzione
Come suggerito proprio alla fine della domanda, il problema è che eccezione asincrona potrebbe essere generata dopo la chiamata a Monitor.Enter
ma prima di inserire il blocco try
.
Il nuovo modo di fare le cose assicura che qualunque cosa accada, premi il blocco finalmente e sarai in grado di rilasciare il blocco se lo hai acquisito. (Non puoi acquisirlo se Monitor.Enter
genera un'eccezione, per esempio.)
IIRC, questo è il nuovo comportamento della parola chiave lock
quando si sceglie come target .NET 4.0.