2011-10-12 3 views
7

ReadWriterLockSlim이 "System.Threading.SynchronizationLockException - 쓰기 잠금이 해제되지 않고 해제됩니다."라는 상황이 발생합니다. ExitWriteLock()을 실행하려고 할 때. 내가 말할 수있는 한, try 블록에 들어간 후속 스레드는 잠금을 얻을 때까지 '차단'될 것이기 때문에 이런 일이 발생하지 않아야합니다. 내가 여기서 뭔가를 놓치고 있니?쓰기 잠금이 해제되지 않고 해제 됨

문제는 this one과 매우 유사하지만 해결 방법은 없습니다.

//Code simplified for example. 

public class i18nService { 
    internal static ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion); 

    private string ProcessText() 
    { 
     try { 
      cacheLock.EnterWriteLock(); 
      return "xyz"; 
     } 
     finally { 
      cacheLock.ExitWriteLock(); // Error is throwing here. 
     } 
    } 
} 

답변

4
try { 
     cacheLock.EnterWriteLock(); 
     return "xyz"; 
    } 
    finally { 
     cacheLock.ExitWriteLock(); // Error is throwing here. 
    } 

Q :-) 당신의 도움을 주셔서 대단히 감사합니다 : cacheLock.EnterWriteLock();이 실패하면 어떻게됩니까?

A : finally 문이 실행됩니다. , 아마도 .NET은 그 EnterWriteLock()이 실패 할 경우 같은 방식으로 설계되어

private string ProcessText() 
{ 
    cacheLock.EnterWriteLock(); 
    try { 
     return "xyz"; 
    } 
    finally { 
     cacheLock.ExitWriteLock(); // Error is throwing here. 
    } 
} 

:

  • cacheLock.ExitWriteLock();
  • 를 호출된다 그러나 우리는

이 시도 잠금이없는 자물쇠가 해제됩니다 (또는 전혀 보관되지 않음).

+0

G '데이 브렌든. 응답 해 주셔서 감사합니다. 나는 실제로 유사한 선을 따라 생각했지만 그것이 사실이라는 것을 확신하지 못했습니다. http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.enterwritelock.aspx "이 메서드는 호출중인 스레드가 잠금을 입력 할 때까지 차단되므로 반환 할 수 없습니다. TryEnterWriteLock 메서드를 사용하십시오 지정된 간격 동안 블로킹하고 호출 스레드가 해당 간격 동안 쓰기 모드에 들어 가지 않으면 리턴합니다. " 그러나 여러분이 지적한대로 EnterWriteLock()에 대한 예외는 허용하지 않습니다 ... ... 흠 ... 내가 더 많이 그걸 가지고 놀도록하겠습니다. –

6

그러나 잠금을 입력하는 중에 오류가 발생하면 마지막 잠금을 유지하지 않고 실행됩니다. 단순히 다음과 같이 굳지 않게하십시오 :

... 
finally { 
    if(cacheLock.IsWriteLockHeld) 
     cacheLock.ExitWriteLock(); 
} 
... 
+0

안녕하세요. 나는 너와 브렌든이 옳다고 생각한다. 건배 :-) –

관련 문제