Abbiamo avuto una discussione sul lavoro riguardante il blocco e cosa accade esattamente. Il codice che ha attivato questa discussione è:Quali sono le implicazioni dell'uso del blocco (typeof (stringa))
string name = (string)context.Cache[key];
if (String.IsNullOrEmpty(name)){
lock (typeof(string)){
name = (string)context.Cache[key];
//.. other code to get the name and then store in the cache
}
}
Io vedo questo come straight-forward: cerca un valore nella cache, se non è lì poi ottenere un blocco in modo da niente altro interrompe mentre il codice prende il nome e lo memorizza nella cache.
La nostra discussione si è concentrata sul fatto che (typeof (stringa)) sia il modo migliore di fare le cose e che cosa è esattamente ciò che fa.
La mia domanda è cosa fa esattamente lock (typeof (stringa))? Crea una stringa locale da utilizzare come lock o crea qualcosa con un ambito più ampio e quindi potenzialmente non sicuro.
No, blocca tutto il tipo - [e può essere pericoloso] (http://stackoverflow.com/questions/1603008/why-is-lock-typeof-mytype-a-problem).Se creasse solo una stringa casuale da bloccare, in che modo gli altri blocchi saprebbero bloccare la stessa istanza di quella stringa? Ti consiglierei di creare un oggetto fittizio da bloccare come 'oggetto privato _lockOnThis = new object()'. – vcsjones
Penso che typeof (SomeType) restituirà sempre la stessa istanza di tipo per lo stesso tipo. Quindi dovresti usare un'istanza disponibile globalmente come un blocco che non è la migliore idea di IMHO. – helb
@vcsjones Attualmente sto rimuovendo tutte le istanze di questo modo di bloccare, ma ero interessato a ciò che faceva esattamente. –