C# · Intermediário · Inglês · Técnico
ConcurrentDictionary
Dicionário seguro para acesso por várias threads, com operações compostas como GetOrAdd e AddOrUpdate, sem exigir que o código chame lock por fora.
Onde usar
Aparece em caches e contadores compartilhados. Importa saber que a função fábrica passada a GetOrAdd pode rodar mais de uma vez em caso de disputa, e só um valor vence; use Lazy se a criação for cara.
Em código
using System.Collections.Concurrent;
ConcurrentDictionary<string, int> c = new();
int v = c.GetOrAdd("a", k => k.Length);
c.AddOrUpdate("a", 1, (k, o) => o + 1);
Console.WriteLine(c["a"]); // 2Exemplos
Swap the dictionary for a ConcurrentDictionary.
Troque o dicionário por um ConcurrentDictionary.
GetOrAdd may run the factory more than once.
O GetOrAdd pode executar a fábrica mais de uma vez.
Cuidado
Não presuma que sequências como ContainsKey seguido de Add são seguras: entre as duas chamadas outra thread pode ter alterado o dicionário.