Middle+
В каква конструкция се преобразува операторът lock в C#?
sobes.tech AI
Отговор от AI
Операторът lock в C# се преобразува в извиквания на методите Monitor.Enter и Monitor.Exit (или Monitor.TryEnter с последващ Monitor.Exit) в блок try...finally.
// Оригинален код с lock
object lockObject = new object();
lock (lockObject)
{
// Защитен код
}
// Трансформацията ще направи приблизително следното:
object lockObject = new object();
bool lockTaken = false; // Флаг за следене дали мониторът е взет
try
{
Monitor.Enter(lockObject, ref lockTaken); // Опит за вземане на монитора
// Може да се използва `Monitor.TryEnter` вместо `Monitor.Enter`
if (lockTaken) // Проверка дали мониторът е взет
{
// Защитен код
}
}
finally
{
if (lockTaken) // Освобождаване на монитора само ако е взет
{
Monitor.Exit(lockObject);
}
}
Използването на Monitor.Enter с параметър ref bool lockTaken и блок try...finally гарантира, че мониторът ще бъде освободен дори при възникване на изключение в защитения код.