2014-09-23 48 views
2

我有一個多線程應用程序中的靜態字典。 class A讀取字典和類B從中刪除。 我想在從字典中刪除字典或從字典中讀取時鎖定字典,以防止在併發情況下訪問字典。 如何鎖定字典?如何鎖定字典?

public static Dictionary<string, Thread> DicThreads = new Dictionary<string, Thread>(); 
    Class A() 
    { 
    private void MethodA() 
    { 
if (DicThreads.ContainsKey(key)) 
     if (DicThreads[key] == null || DicThreads[key].ThreadState == ThreadState.Stopped) 
    { 
    //--- Do something 
    } 
    } 


    class B 
    { 
     private void MethodB() 
    { 
     DicThreads.Remove(key) 
    } 

} 
+8

爲什麼不使用'ConcurrentDictionary' ?: http://msdn.microsoft.com/pl-pl/library/dd287191(v=vs.110).aspx – 2014-09-23 07:51:18

+0

鎖(字典){...} – Gusman 2014-09-23 07:51:42

+0

如果您使用.NET 4或更高版本,請使用COncurrentDictionary – cost 2014-09-23 07:52:21

回答

2

你可以使用ConcurrentDictionary pwas建議。如果要同步您擁有的字典,請使用lock關鍵字。

您通常應該使用單獨的對象進行同步,並且不要將該對象暴露在範圍之外。這可以確保代碼塊外的代碼不能將相同的對象用於鎖並導致衝突。

public static Dictionary<string, Thread> DicThreads = new Dictionary<string, Thread>(); 
private static object sync = new Object(); 

Class A() { 

    private void MethodA() { 
    lock (sync) { 
     if (DicThreads.ContainsKey(key)) { 
     if (DicThreads[key] == null || DicThreads[key].ThreadState == ThreadState.Stopped) { 
      //--- Do something 
     } 
     } 
    } 
    } 

} 

class B { 

    private void MethodB() { 
    lock (sync) { 
     DicThreads.Remove(key) 
    } 
} 

} 
2

可以使用lock

lock (DicThreads) 
{ 
    // Any code here is synchronized with other 
    // (including this block on other threads) 
    // lock(DicThreads) blocks 
} 

但是,如果你有線程的字典在您的應用程序,你可能做錯了。閱讀全部關於Task-Based Asynchronous Pattern (TAP) here

Stephen Cleary has wirtten a useful AsyncCollection<T> class。 NuGet上的Nito.AsyncEx包可用。

如果你需要一個異步集合它是一個很好的候選者,它實際上需要一個ConcurrentBag/Stack/Queue或其他一些IProducerConsumerCollection來提供支持狀態。

請記住,如上所述,您不應該自己管理線程,如問題所示。