Middle+
In quale costruzione si trasforma l'operatore lock in C#?
sobes.tech AI
Risposta dell'AI
L'operatore lock in C# viene trasformato in chiamate ai metodi Monitor.Enter e Monitor.Exit (o Monitor.TryEnter con un Monitor.Exit successivo) all'interno di un blocco try...finally.
// Codice originale con lock
object lockObject = new object();
lock (lockObject)
{
// Codice protetto
}
// La trasformazione farà più o meno quanto segue:
object lockObject = new object();
bool lockTaken = false; // Flag per tracciare se il monitor è stato acquisito
try
{
Monitor.Enter(lockObject, ref lockTaken); // Tentativo di acquisizione del monitor
// È possibile usare `Monitor.TryEnter` invece di `Monitor.Enter`
if (lockTaken) // Verifica se il monitor è stato acquisito
{
// Codice protetto
}
}
finally
{
if (lockTaken) // Rilascia il monitor solo se è stato acquisito
{
Monitor.Exit(lockObject);
}
}
L'uso di Monitor.Enter con il parametro ref bool lockTaken e un blocco try...finally garantisce che il monitor venga rilasciato anche in caso di eccezione nel codice protetto.