2011-10-12 96 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. 
    } 

問:如果cacheLock.EnterWriteLock();失敗會發生什麼?

答:finally語句被執行。

  • cacheLock.ExitWriteLock();被稱爲
  • 但是我們沒有鎖

試試這個:

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

大概.NET的設計中,如果EnterWriteLock()失敗,這樣,該鎖被釋放(或根本沒有)。

+0

G'day Brendan。感謝您的迴應。我其實也有類似的想法,但我不確定是這樣。 from http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.enterwritelock.aspx 「此方法阻塞,直到調用線程進入鎖定,因此可能永遠不會返回。使用TryEnterWriteLock方法阻塞指定的時間間隔,然後在該時間間隔內調用線程未進入寫入模式時返回。「 然而,正如你所指出的那樣,我不允許在EnterWriteLock()上發生異常......嗯......讓我再玩一次。 –

6

但是,如果嘗試輸入鎖定時發生錯誤,那麼它將最終執行,而不保留它。爲什麼不簡單地對:

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

嗨,Petar。我認爲你(和Brendan)是對的。乾杯:-) –