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.