Sobes.tech
Middle+

Milyen szerkezetre alakul a lock operátor C#-ban?

sobes.tech MI

Válasz az MI-től

A lock operátor C#-ban átíródik a Monitor.Enter és Monitor.Exit metódusok hívásaira (vagy Monitor.TryEnter-re Monitor.Exit-tel együtt) egy try...finally blokkban.

// Eredeti kód lock-kal
object lockObject = new object();
lock (lockObject)
{
    // Védett kód
}

// A transzformáció nagyjából a következő lesz:
object lockObject = new object();
bool lockTaken = false; // Jelző a monitor megszerzésének nyomon követésére
try
{
    Monitor.Enter(lockObject, ref lockTaken); // Megpróbálja megszerezni a monitort
    // A `Monitor.TryEnter` helyett használható a `Monitor.Enter`
    if (lockTaken) // Ellenőrzi, hogy a monitor megszerzésre került-e
    {
        // Védett kód
    }
}
finally
{
    if (lockTaken) // Csak akkor szabadítja fel a monitort, ha az megszerzésre került
    {
        Monitor.Exit(lockObject);
    }
}

A Monitor.Enter használata a ref bool lockTaken paraméterrel és a try...finally blokk garantálja, hogy a monitor akkor is felszabadul, ha kivétel történik a védett kódban.