Sobes.tech
Middle+

Į kokią konstrukciją transformuojasi lock operatorius C#?

sobes.tech AI

Atsakymas iš AI

C# kalboje lock operatorius yra paverčiamas į Monitor.Enter ir Monitor.Exit metodų iškvietimus (arba Monitor.TryEnter su vėlesniu Monitor.Exit) try...finally bloke.

// Pradinė kodas su lock
object lockObject = new object();
lock (lockObject)
{
    // Apsaugotas kodas
}

// Transformacija maždaug taip:
object lockObject = new object();
bool lockTaken = false; // Žymeklis, sekantis ar monitorius buvo įgytas
try
{
    Monitor.Enter(lockObject, ref lockTaken); // Bandymas įgyti monitorių
    // Vietoje `Monitor.Enter` galima naudoti `Monitor.TryEnter`
    if (lockTaken) // Patikriname, ar monitorius buvo įgytas
    {
        // Apsaugotas kodas
    }
}
finally
{
    if (lockTaken) // Išlaisviname monitorių tik jei jis buvo įgytas
    {
        Monitor.Exit(lockObject);
    }
}

Naudojant Monitor.Enter su ref bool lockTaken parametru ir try...finally bloką, užtikrinama, kad monitorius bus išlaisvintas net ir įvykus išimčiai apsaugotame kode.