Diccionario estático en .Net Seguridad de subprocesos
-
03-07-2019 - |
Pregunta
Lectura documentación msdn para los diccionarios que dice: & Los miembros estáticos públicos (compartidos en Visual Basic) de este tipo son seguros para subprocesos. No se garantiza que los miembros de la instancia sean seguros para subprocesos. & Quot;
Esto significa que con un diccionario como este:
static object syncObject = new object();
static Dictionary<string,MyObject> mydictionary= new Dictionary<string, MyObject>();
¿Es innecesario hacer algo como el siguiente código?
lock (syncObject)
{
context = new TDataContext();
mydictionary.Add("key", myObject);
}
Solución
Se refiere a métodos estáticos en la clase misma. La declaración es en realidad documentación repetitiva agregada a la mayoría de las clases. El Diccionario & Lt; & Gt; la clase en realidad no expone ningún método estático.
Tendrá que serializar el acceso a su clase de diccionario utilizando la palabra clave de bloqueo o tal vez incluso un ReaderWriterLock. Sin embargo, el enhebrado es un tema bastante complejo y la palabra clave de bloqueo no siempre es apropiada. Hay un gran libro de Joe Duffy & Quot; Programación concurrente en Windows < !> quot; que profundiza en la protección de los recursos de aplicaciones compartidas.
Otros consejos
Está malinterpretando " miembros públicos estáticos de este tipo " como " instancias públicas estáticas de este tipo " ;.
Significa que si llama al método Add (un método de instancia) será mejor que se asegure de tener acceso exclusivo al Diccionario utilizando su propia semántica de bloqueo o serialización. Podrían ocurrir cosas malas si dos hilos están modificando el estado de su Diccionario al mismo tiempo, y es su responsabilidad asegurarse de que esto no suceda. No hay nada dentro del método Agregar del diccionario que haga este bloqueo por usted.
Sin embargo, si llama a algún método estático en el Diccionario (del cual no hay ninguno útil), estaría bien sin un bloqueo.
Esta es la regla general para todos los tipos .NET en el BCL.