2008-11-29 17 views
10

Las tablas hash tienen una propiedad syncroot pero los diccionarios genéricos no. Si tengo código que hace esto:Hashtable to Dictionary <> syncroot.

lock (hashtable.Syncroot) 
{ 
.... 
} 

¿Cómo replicar esto si estoy quitando la tabla hash y cambiando a los diccionarios genéricos?

Respuesta

10

Si va estrictamente para la compatibilidad, entonces Bryan está en lo cierto. Esta es la mejor manera de mantener su semántica actual sobre un diccionario.

Sin embargo, se amplía. La razón por la que la propiedad SyncRoot no se agregó directamente al diccionario genérico es que es una forma peligrosa de realizar la sincronización. Es ligeramente mejor que "bloquear (esto)", que es muy peligroso y propenso a bloqueos. Aquí hay un par de enlaces que explican por qué esto es malo.

+0

es decir, no hagas esto. – Will

+5

Totalmente de acuerdo. Sin embargo, realmente lo odio cuando las personas responden con "esto es malo, no lo hagas" :). La mayoría de las veces las personas hacen una pregunta: a menudo están atrapados en un escenario particular y necesitan trabajar en ello. Intento brindar ayuda sobre el problema y consejos sobre por qué es malo y cómo evitarlo. – JaredPar

5
var dictionary = new Dictionary<int, string>(); 

lock(((ICollection) dictionary).SyncRoot) 
{ 
    // ... 
} 
3

Si el hashtable/diccionario no es público, puede simplemente bloquear el objeto de diccionario.

7

El nuevo pensamiento detrás de SyncRoot es que fue un error en el diseño original. Si lo único que desea bloquear es el diccionario y es privado, puede bloquearlo u otro objeto que sirva como objeto de sincronización. La última técnica es útil cuando el estado que está protegiendo es más que solo el diccionario.

// 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. 
} 
+0

¿Tiene un presupuesto de origen en que se trataba de un error en el diseño original? – dalle

+1

Brad Abrams y Krzysztof Cwalina (Gerentes de programa de .NET) lo dicen: http://blogs.msdn.com/brada/archive/2003/09/28/50391.aspx – netadictos

+0

Jeffrey Richter también cubre este error de diseño en CLR Via C#. – Will

Cuestiones relacionadas