2011-08-24 5 views
2

lock 객체를 사용해야하지만 이미 다른 스레드에서 사용하고 있습니다. 자물쇠 개체가 무료이지만 기다리는 것이지만 어떻게 해야할지 모르겠다. C# threads synchronization

내가 좋아하는 STH 발견

if(Monitor.TryEnter(_lock) 
{ 
try 
{ 
    // do work 
} 
finally 
{ 
    Monitor.Exit(_lock); 
} 

} 

을하지만 그것은 단지 확인하고 계속,하지만 난 락 객체가 될 때까지 기다려야 바랍니다.

답변

2

어느 쪽이를 사용

Monitor.Enter(_lock) 

try 
{ 
    // do work 
} 
finally 
{ 
    Monitor.Exit(_lock); 
} 

또는 - 더 바람직를 - lock 키워드 :

lock(_lock) 
{ 
    // do work 
} 

는 사실, 그 코드 조각은 동일한 코드를 생성합니다. 컴파일러는 두 번째 코드를 첫 번째 코드로 변환합니다. 그러나 두 번째는 훨씬 더 읽기 쉽기 때문에 선호됩니다.

UPDATE :.
로크 그것에서 획득 한 스레드에 속하는 수단은 lock 문 중첩 사용이 가능하다 : 상기 코드가 차단되지

void MethodA() 
{ 
    lock(_lock) 
    { 
     // ... 
     MethodB(); 
    } 
} 

void MethodB() 
{ 
    lock(_lock) 
    { 
     // ... 
    } 
} 

.

+1

하지만 문제는 잠금 개체가 다른 스레드에서 호출되었지만 동일한 스레드에서 사용된다는 것입니다. 나는 자물쇠가 자유 롭다는 것을 기다리고 싶다. 내 영어에 대한 Sorrey, 최선을 설명하려고 노력하고 있습니다 ... – santBart

+0

@ user898569 : 문제를 다시 설명해주십시오. 나는 당신의 의견을 이해하지 못했습니다. 스레드가 이미 잠금을 가지고 있으면 두 번째 호출이 차단되지 않습니다. 업데이트를 참조하십시오. –

0

당신은 문서에서 Monitor.Enter

를 사용할 수 있습니다

사용이 매개 변수로 전달 된 객체의 모니터를 취득 입력합니다. 다른 스레드가 객체에 Enter를 실행했지만 이 아직 해당 Exit를 실행하지 않은 경우 다른 스레드가 객체를 해제 할 때까지 현재 스레드는 을 차단합니다.

0

@Daniel Hilgarth와 동의하는 경우 lock 구문을 사용하는 것이 좋습니다. 내가 락 객체는 무료입니다 동안 기다려하고자하지만 어떻게이 일을 아무 생각

: 귀하의 질문에 대해서는

. MSDN description 당으로

:

잠금 다른 스레드가 코드의 임계 영역에있는 동안 하나 개의 스레드가 임계 영역을 입력하지 않도록합니다. 다른 스레드가 잠긴 코드를 입력하려고하면 객체가 해제 될 때까지 대기합니다 (블록).

즉 이미 원하는대로 코드를 작성하십시오.