Sobes.tech
Middle+

Do akej konštrukcie sa transformuje operátor lock v C#?

sobes.tech AI

Odpoveď od AI

Operátor lock v C# sa transformuje na volania metód Monitor.Enter a Monitor.Exit (alebo Monitor.TryEnter s následným Monitor.Exit) v bloku try...finally.

// Pôvodný kód s lock
object lockObject = new object();
lock (lockObject)
{
    // Chránený kód
}

// Transformácia bude približne nasledovná:
object lockObject = new object();
bool lockTaken = false; // Vlajka na sledovanie, či bol monitor získaný
try
{
    Monitor.Enter(lockObject, ref lockTaken); // Pokus o získanie monitora
    // Namiesto `Monitor.Enter` možno použiť `Monitor.TryEnter`
    if (lockTaken) // Kontrola, či bol monitor získaný
    {
        // Chránený kód
    }
}
finally
{
    if (lockTaken) // Uvoľní monitor iba ak bol získaný
    {
        Monitor.Exit(lockObject);
    }
}

Použitie Monitor.Enter s parametrom ref bool lockTaken a blokom try...finally zabezpečuje, že monitor bude uvoľnený aj v prípade výnimky v chránenom kóde.