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.