2011-08-15 2 views
14

다음 코드를 사용하여 잠금 문제는 MSDN에서이다 : 나는 try 블록 외부에 항상) (다른 places.The EnterWriteLock이 같은 코드를 본 적이C 번호 - EnterWriteLock

private ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim(); 
private Dictionary<int, string> innerCache = new Dictionary<int, string>(); 

public void Add(int key, string value) 
{ 
    cacheLock.EnterWriteLock(); 
    try 
    { 
     innerCache.Add(key, value); 
    } 
    finally 
    { 
     cacheLock.ExitWriteLock(); 
    } 
} 

. 아무도 try 블록 안에 있지 않은 이유를 알고 있습니까?

답변

17

EnterWriteLock()이 실패했다고 가정합니다. 이유가 무엇이든지.

그런 다음 입력하지 않은 잠금 장치를 종료해야합니다.

매우 기본적인 패턴으로, 예를 들어 스트림에 대해서는 있지만, using() {} 문으로 인해 자주 볼 수없는 패턴입니다.

var s = File.Create(...); 
// (only) if the previous line succeeded, 
// we gain the responsibility to close s, no matter what 
try 
{ 
    // do some I/O 
} 
finally 
{ 
    s.Dispose(); 
} 
5

이는 버그 일 수 있습니다. ExitWriteLock은 입력 한 후에야 호출 할 수 있습니다. try {}로 이동하고 EnterWriteLock()이 예외를 throw하면 어떻게되는지 상상해보십시오. 그것은 두 배의 kaboom입니다. Kabloom, 예외 메시지를 망쳐 놨어.

3

EnterWriteLock이 예외를 throw하면 ExitWriteLock을 호출 할 필요가 없으므로 try 블록에없는 이유가됩니다. EnterWriteLock이 성공적으로 호출되면 ExitWriteLock을 호출해야합니다. LockRecursionException을 던질 수 있으므로 특정 시나리오에서 EnterWriteLock 주위에 try 블록을 래핑 할 수 있습니다. ExitWriteLock은 SynchronizationLockException을 throw 할 수 있으며 응용 프로그램에서 try 블록이 필요할 수 있습니다.