Hashtable para Dictionary <> SyncRoot.
-
11-07-2019 - |
Pergunta
Hashtables tem uma propriedade SyncRoot mas dicionários genéricos não. Se eu tiver código que faz isso:
lock (hashtable.Syncroot)
{
....
}
Como faço para replicar este se eu estou removendo o hashtable e mudando a dicionários genéricos?
Solução
Se você estiver indo estritamente para compatibilidade em seguida, Bryan está correto. Esta é a melhor maneira de manter a sua semântica atuais em cima de um dicionário.
Expandindo-lo embora. A razão a propriedade SyncRoot não foi adicionado diretamente ao dicionário genérico é que é uma forma perigosa de se fazer a sincronização. É apenas slighly melhor do que "bloqueio (this)", que é muito perigoso e propenso a impasses. Aqui estão alguns links que falam de por que isso é ruim.
Outras dicas
O novo pensamento por trás SyncRoot é que foi um erro no projeto original. Se a única coisa a fechadura é o dicionário e é privada, você pode bloqueá-lo ou outro objeto que serve como o objeto de sincronização. Esta última técnica é útil quando o estado que você está protegendo é mais do que apenas o dicionário.
// used as you would have used SyncRoot before
object _syncLock = new object();
Dictionary<string, int> numberMapper = new Dictionary<string, int>();
// in some method...
lock (_syncLock)
{
// use the dictionary here.
}
var dictionary = new Dictionary<int, string>();
lock(((ICollection) dictionary).SyncRoot)
{
// ...
}
Se o hashtable / dicionário não é público, você poderia simplesmente bloquear o próprio objeto de dicionário.