我需要支持更新兩個併發字典(創建,更新,刪除)的功能。 每個操作(更新,刪除,創建)使用其中的兩個,應該是原子的。 .NET C#中最好的方法是什麼?如何同時更新兩個字典
回答
最簡單的方法是使用一個鎖:
private object m_methodMonitor = new object();
private void Update()
{
lock (m_methodMonitor)
{
// Do whatever
}
}
private void Delete()
{
lock (m_methodMonitor)
{
// Do whatever
}
}
請注意:在字典鎖定「寫」操作是不夠的!您還需要同步字典的閱讀,以避免出現當您嘗試從字典中獲取值的情況,該字典當前正在通過某種更新方法訪問。
每個鍵的鎖定機制如何? – taminov
需要注意的是,無論您在何處訪問字典實例,都必須在類似的'lock'語句中執行此操作,而不僅僅是列出的三個操作。 –
@Tragedian:對,我會更新我的答案。 –
這裏的挑戰是要求這兩個字典必須是修改原子。 ConcurrentDictionary<TKey,TValue>
類沒有任何內置機制來支持「組合」實例,以允許同時更新共享相同密鑰的鍵值對。
因此,您可以使用的任何高吞吐量機制都無法在操作中授予您原子性。
你可以做在一組對象,使原子操作的唯一一件事就是包訪問對象鎖定機制:
public void Update(...)
{
lock(this.dictionaryLock)
{
this.dictionaryA.AddOrUpdate(...);
this.dictionaryB.AddOrUpdate(...);
}
}
你可能會得到不同的鎖定機制更好的效果,優化到您的應用程序的常見模式(例如,如果您的應用程序傾向於頻繁閱讀並且不經常修改,則使用ReaderWriterLockSlim
),但您只能串行訪問整個字典。
如果併發性能對您非常重要,您必須重構您的設計以使用一個併發字典而不是兩個。
- 1. 更新表中兩個字段同時
- 2. 同時更新兩個UILabel
- 3. 如何合併兩個嵌套的字典相同的字典
- 4. 如何在使用兩個單獨更新的同時更新兩個表?
- 5. 如何同時更新兩列?
- 6. 同時更新來自不同型號的兩個字段
- 7. 在codeigniter中同時更新兩個表
- 8. PHP同時更新兩個表
- 9. 兩個在同一時間UI更新
- 10. C#同時更新兩個文本框?
- 11. 同時更新兩個表格
- 12. 同時更新兩個數據庫
- 13. 同時更新兩個模型(Laravel 4.2)
- 14. 如何可以同時訪問/更新兩個數據庫
- 15. 如何同時使用jquery ajax更新兩個div?
- 16. 如何在頁面中同時執行兩個更新面板?
- 17. 如何在同時更新Rails中的兩個模型?
- 18. 如何讓tinymce同時更新兩個元素?
- 19. 如何同時更新兩個$ scope屬性
- 20. 如何使用Ruby Observer方法同時更新兩個參數?
- 21. C#更新字典在不同的類
- 22. 如何處理這兩個字典以獲取Python中的新字典?
- 23. Postgres:兩個同名的字典
- 24. Rails:同時更新ActiveRecord實例的兩個字段
- 25. 同時更新兩個動態文本字段
- 26. 如何並排更新字典值?
- 27. 如何更新多級字典?
- 28. 如何更新字典中的鍵?
- 29. '更新'屬性可以同時更新兩個組件嗎?
- 30. 如何用4個id字段同時更新3個表格?
當你說「並行字典」時,你指的是什麼類? –
System.Collections.Concurrent.ConcurrentDictionary – taminov