Como devo manter 2 ConcurrentDictionaries sincronizados?
-
11-12-2019 - |
Pergunta
Eu gosto da operação sem bloqueio do Dicionário Simultâneo e use-o em dois objetos:
ConcurrentDictionary<datetime,myObj> myIndexByDate
ConcurrentDictionary<myObjSummary, ConcurrentDictionary<int, myObj> myObjectSummary Index
Esses dois objetos precisam permanecer sincronizados.A única maneira de fazer isso é usar um Lock, evitando assim todos os benefícios do dicionário Concurrent?
Solução
Eu criaria uma classe customizada com 2 dicionários e usaria um bloqueio apenas nos métodos que são suscetíveis de alterar o dicionário (Adicionar, Excluir).
Você não perde os benefícios do dicionário simultâneo, pois esse método requer muito menos código do que você precisaria usar o dicionário normal.
Outras dicas
ConcurrentDictionary é apenas "thread-safe" nas operações em uma instância específica.por exemplo.enquanto uma chamada ConcurrentDictionary.TryAdd() está sendo invocada, nenhum outro thread pode modificar a coleção...
Isso não significa que, embora você obtenha um valor de um dicionário e o adicione a outro dicionário, o valor ainda exista no dicionário original enquanto você o adiciona ao segundo.
Você provavelmente tem uma invariante que detalha que enquanto você move um valor de um dicionário para outro, nenhum valor no dicionário original pode ser removido (ou pelo menos que valor, mas isso é um pouco mais difícil de garantir com ConncurrentDictionary.