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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top