이 lock
문장은 C # 3.0에 의해 다음과 같이 번역됩니다.
var temp = obj;
Monitor.Enter(temp);
try
{
// body
}
finally
{
Monitor.Exit(temp);
}
C # 4.0에서는 이것이 변경 되었으며 이제 다음과 같이 생성됩니다.
bool lockWasTaken = false;
var temp = obj;
try
{
Monitor.Enter(temp, ref lockWasTaken);
// body
}
finally
{
if (lockWasTaken)
{
Monitor.Exit(temp);
}
}
당신은 무엇에 대한 자세한 정보를 찾을 수 있습니다 Monitor.Enter
않습니다 여기를 . MSDN을 인용하려면 :
Enter
매개 변수로 전달 된 오브젝트에서 모니터를 획득하는 데 사용하십시오 . 다른 스레드가 Enter
객체에서 실행했지만 해당를 아직 실행하지 않은 Exit
경우 다른 스레드가 객체를 해제 할 때까지 현재 스레드가 차단됩니다. 동일한 스레드가 Enter
차단없이 두 번 이상 호출하는 것이 합법적입니다
. 그러나 Exit
객체를 기다리는 다른 스레드가 차단을 해제하기 전에 동일한 수의 호출 을
호출해야합니다.
이 Monitor.Enter
방법은 무한정 기다릴 것입니다. 그것은 것입니다 하지 타임 아웃.