Sobes.tech
Middle+

În ce construcție se transformă operatorul lock în C#?

sobes.tech AI

Răspuns de la AI

Operatorul lock în C# se transformă în apeluri ale metodelor Monitor.Enter și Monitor.Exit (sau Monitor.TryEnter urmat de Monitor.Exit) într-un bloc try...finally.

// Codul original cu lock
object lockObject = new object();
lock (lockObject)
{
    // Cod protejat
}

// Transformarea va face aproximativ următorul lucru:
object lockObject = new object();
bool lockTaken = false; // Flag pentru urmărirea dacă monitorul a fost preluat
try
{
    Monitor.Enter(lockObject, ref lockTaken); // Încercarea de a prelua monitorul
    // Se poate folosi `Monitor.TryEnter` în loc de `Monitor.Enter`
    if (lockTaken) // Verificăm dacă monitorul a fost preluat
    {
        // Cod protejat
    }
}
finally
{
    if (lockTaken) // Eliberăm monitorul doar dacă a fost preluat
    {
        Monitor.Exit(lockObject);
    }
}

Utilizarea lui Monitor.Enter cu parametrul ref bool lockTaken și blocul try...finally garantează că monitorul va fi eliberat chiar și în cazul apariției unei excepții în codul protejat.