Secondo le specifiche del linguaggio lock(obj) statement;
sarà compilato come:Qual è il vantaggio di Monitor.Enter (oggetto, ref bool) su Monitor.Enter (oggetto)?
object lockObj = obj; // (the langspec doesn't mention this var, but it wouldn't be safe without it)
Monitor.Enter(lockObj);
try
{
statement;
}
finally
{
Monitor.Exit(lockObj);
}
Tuttavia, è compilato come:
try
{
object lockObj = obj;
bool lockTaken = false;
Monitor.Enter(lockObj, ref lockTaken);
statement;
}
finally
{
if (lockTaken) Monitor.Exit(lockObj);
}
che sembra essere molto più complicato di quanto necessario. Quindi la domanda è: qual è il vantaggio di tale implementazione?
Stavo per rispondere a me stesso dopo aver pensato a un'altra risposta che è stata purtroppo cancellata prima che potessi commentare. Mi ha fatto riflettere su quando le eccezioni potevano essere lanciate, i thread interrotti possibilmente ovunque, ecc. Era abbastanza ovvio che "Monitor.Enter" poteva tornare con successo, ma prima che il thread entrasse nel blocco try, poteva essere interrotto. A volte questo sito è troppo veloce per onorare tutte le persone che hanno contribuito a trovare la risposta. – Wormbo