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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top