Se você passar um tipo de valor, ele será bloqueado, e da próxima vez que o código rodar aqui, será bloqueado novamente, e não será o mesmo objeto duas vezes, então não pode ser travado
Fechadura(x)
{ ...
}
O bloqueio é realmente feito através do objeto Monitor:
O acima é equivalente a:
System.Object obj = (System.Object)x; System.Threading.Monitor.Enter(obj); tente
{ ...
} finalmente
{ System.Threading.Monitor.Exit(obj);
}
Então, para citar as palavras originais do MSDN: Use o Monitor para bloquear objetos (ou seja, tipos de referência), não tipos de valor. Quando você passa a variável do tipo avalue para Enter, ela é encaixada como um objeto. Se você passar a mesma variável para Enter novamente, ela fica em caixa como um objeto separado, e o thread não bloqueia. Nesse caso, o código que o Monitor supostamente está protegendo não está protegido. Além disso, quando você passa a variável para Sair, ainda outro objeto separado é criado. Como o objeto passado para Sair é diferente do objeto passado para Enter, o Monitor lança SynchronizationLockException. Para mais informações, consulte o tema conceitual Monitores. |