2012-12-10 50 views
2

我需要支持更新兩個併發字典(創建,更新,刪除)的功能。 每個操作(更新,刪除,創建)使用其中的兩個,應該是原子的。 .NET C#中最好的方法是什麼?如何同時更新兩個字典

+0

當你說「並行字典」時,你指的是什麼類? –

+0

System.Collections.Concurrent.ConcurrentDictionary – taminov

回答

3

最簡單的方法是使用一個鎖:

private object m_methodMonitor = new object(); 

private void Update() 
{ 
    lock (m_methodMonitor) 
    { 
     // Do whatever 
    } 
} 


private void Delete() 
{ 
    lock (m_methodMonitor) 
    { 
     // Do whatever 
    } 
} 

請注意:在字典鎖定「寫」操作是不夠的!您還需要同步字典的閱讀,以避免出現當您嘗試從字典中獲取值的情況,該字典當前正在通過某種更新方法訪問。

+0

每個鍵的鎖定機制如何? – taminov

+0

需要注意的是,無論您在何處訪問字典實例,都必須在類似的'lock'語句中執行此操作,而不僅僅是列出的三個操作。 –

+0

@Tragedian:對,我會更新我的答案。 –

2

這裏的挑戰是要求這兩個字典必須是修改原子ConcurrentDictionary<TKey,TValue>類沒有任何內置機制來支持「組合」實例,以允許同時更新共享相同密鑰的鍵值對。

因此,您可以使用的任何高吞吐量機制都無法在操作中授予您原子性。

你可以做在一組對象,使原子操作的唯一一件事就是包訪問對象鎖定機制:

public void Update(...) 
{ 
    lock(this.dictionaryLock) 
    { 
     this.dictionaryA.AddOrUpdate(...); 
     this.dictionaryB.AddOrUpdate(...); 
    } 
} 

你可能會得到不同的鎖定機制更好的效果,優化到您的應用程序的常見模式(例如,如果您的應用程序傾向於頻繁閱讀並且不經常修改,則使用ReaderWriterLockSlim),但您只能串行訪問整個字典。

如果併發性能對您非常重要,您必須重構您的設計以使用一個併發字典而不是兩個。