2010-12-21 62 views

回答

3

你的意思是你要確保沒有其他人使用字典,或沒有其他人使用這字典是價值?

您可以使用鎖定來解決第一個問題,但您無法真正完成第二個。有人可以從字典中獲取對象的引用,並只要他們喜歡就存儲該引用。有可能是一個解決方案,如果該值是一個接口類型 - 您可以通過一個額外的「包裝」類委託所有調用,並使該包裝類失效。我可以進入更多的細節,如果你想要的,但我希望你真的只是在第一種類型的安全:)

這可以這樣實現的興趣:

private static readonly object mutex = new object(); 

// Or whatever 
private static readonly Dictionary<string, string> map = 
    new Dictionary<string, string>(); 

public static void AddEntry(string key, string value) 
{ 
    lock (mutex) 
    { 
     map[key] = value; 
    } 
} 

public static string GetValue(string key, string value) 
{ 
    lock (mutex) 
    { 
     return map[key]; 
    } 
} 

顯然你會想調整你使用字典的方式。

如果您使用的是.NET 4,另一種方法是使用已經線程安全的ConcurrentDictionary

+2

@Jon:有問題。我通常使用字典本身作爲同步根(當它是一個私人領域),而不是創建一個單獨的對象。在這種情況下使用單獨對象的優點是什麼? – jgauffin 2010-12-21 07:32:03

+0

@Jon:謝謝你的回覆。我想實現你提到的第二件事。即當我試圖從字典中刪除它時,確保沒有人正在使用值。我的應用程序沒有使用.NET 4.0。它在.NET 3.5上。但是,您能否提供更多細節來實現它? (你已經提到包裝類)。 – Learner 2010-12-21 07:57:23

+2

@jgauffin:我不知道'Dictionary'中的代碼是否自動同步。作爲一個原則問題,我幾乎總是鎖定一個僅用於鎖定課程內容的對象。這意味着我永遠不用擔心其他代碼將會使用該對象進行鎖定。 – 2010-12-21 08:10:07