Sobes.tech
Middle+

Para que construção é transformado o operador lock em C#?

sobes.tech IA

Resposta da IA

O operador lock em C# é transformado em chamadas aos métodos Monitor.Enter e Monitor.Exit (ou Monitor.TryEnter com um Monitor.Exit subsequente) num bloco try...finally.

// Código original com lock
object lockObject = new object();
lock (lockObject)
{
    // Código protegido
}

// A transformação irá fazer aproximadamente o seguinte:
object lockObject = new object();
bool lockTaken = false; // Flag para rastrear se o monitor foi adquirido
try
{
    Monitor.Enter(lockObject, ref lockTaken); // Tentativa de adquirir o monitor
    // Pode usar-se Monitor.TryEnter em vez de Monitor.Enter
    if (lockTaken) // Verifica se o monitor foi adquirido
    {
        // Código protegido
    }
}
finally
{
    if (lockTaken) // Liberta o monitor apenas se foi adquirido
    {
        Monitor.Exit(lockObject);
    }
}

O uso de Monitor.Enter com o parâmetro ref bool lockTaken e um bloco try...finally garante que o monitor será libertado mesmo no caso de uma exceção no código protegido.