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?

Foi útil?

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.

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