Sobes.tech
Middle+

U koju konstrukciju se pretvara operator lock u C#?

sobes.tech АИ

Одговор од АИ

Operator lock u C# se transformiše u pozive metoda Monitor.Enter i Monitor.Exit (ili Monitor.TryEnter sa naknadnim Monitor.Exit) unutar try...finally bloka.

// Originalni kod sa lock
object lockObject = new object();
lock (lockObject)
{
    // Zaštićeni kod
}

// Transformacija će otprilike izgledati ovako:
object lockObject = new object();
bool lockTaken = false; // Zastavica za praćenje da li je monitor stečen
try
{
    Monitor.Enter(lockObject, ref lockTaken); // Pokušaj da se stekne monitor
    // Umesto `Monitor.Enter` može se koristiti `Monitor.TryEnter`
    if (lockTaken) // Proverava se da li je monitor stečen
    {
        // Zaštićeni kod
    }
}
finally
{
    if (lockTaken) // Oslobađa se monitor samo ako je stečen
    {
        Monitor.Exit(lockObject);
    }
}

Korišćenje Monitor.Enter sa parametrom ref bool lockTaken i blokom try...finally garantuje da će monitor biti oslobođen čak i u slučaju izuzetka u zaštićenom kodu.