2011-08-15 39 views
14

下面的代碼鎖定問題是從MSDN: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(); 
    } 
} 

我見過這樣的代碼在其他places.The EnterWriteLock()總是try塊之外。有誰知道它爲什麼不在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()中,會引發異常。這是雙kaboom。卡布洛姆解決了這個異常消息。

3

如果EnterWriteLock引發異常,則不需要調用ExitWriteLock,因此它不在try塊中。如果EnterWriteLock被成功調用,則始終應調用ExitWriteLock。你可能想在某些場景中圍繞EnterWriteLock嘗試一個try塊,因爲它會拋出一個LockRecursionException異常。 ExitWriteLock還可以引發SynchronizationLockException,並且可能需要在應用程序中使用try塊。