Hashtable to Dictionary < > syncroot.
-
11-07-2019 - |
Domanda
Gli hashtable hanno una proprietà syncroot ma i dizionari generici no. Se ho un codice che fa questo:
lock (hashtable.Syncroot)
{
....
}
Come posso replicarlo se sto rimuovendo la tabella hash e sto cambiando in dizionari generici?
Soluzione
Se stai andando rigorosamente per la compatibilità, allora Bryan è corretto. Questo è il modo migliore per mantenere la tua semantica corrente su un dizionario.
Espandendosi però. Il motivo per cui la proprietà SyncRoot non è stata aggiunta direttamente al dizionario generico è che è un modo pericoloso per eseguire la sincronizzazione. È solo leggermente migliore di " lock (questo) " che è molto pericoloso e soggetto a deadlock. Ecco un paio di link che parlano del perché questo è negativo.
Altri suggerimenti
Il nuovo pensiero dietro SyncRoot è che è stato un errore nel design originale. Se l'unica cosa da bloccare è il dizionario ed è privato, puoi bloccarlo o un altro oggetto che funge da oggetto di sincronizzazione. Quest'ultima tecnica è utile quando lo stato che stai proteggendo non è solo il dizionario.
// 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 l'hashtable / dizionario non è pubblico, potresti semplicemente bloccare l'oggetto dizionario stesso.