2010-11-26 18 views
23

tengo un diccionario estático de sólo lectura . No se harán modificaciones a este diccionario.Sólo lectura Diccionario - varios subprocesos llamando .ContainsKey método

que tienen múltiples hilos de lectura de este diccionario utilizando el .ContainsKey (Key). p.ej.

class MyData 
{ 
    private static private IDictionary<int, string> _dictionary = new Dictionary<int, string>(); 

    MyData() 
    { 
     // Load Dictionary here 
    } 

    public string GetValue(int key) 
    { 
     if (_dictionary.ContainsKey(key)) 
     { 
      return _dictionary[key]; 
     } 
    } 
} 

¿Hay algún problema de enhebrado al hacer esto?

Respuesta

19

Si nadie está mutando él: esto está muy bien. Si hubo ediciones ocasionales, entonces tal vez consulte ReaderWriterLockSlim, o (mi preferencia) edite una instantánea/copia y cambie la referencia.

+0

Pero a pesar de ello necesitará el ReaderWriterLockSlim mientras intercambia la referencia, ¿verdad? –

+1

@Mark: Escribir una referencia está garantizado que es atómico, pero supongo que probablemente desee marcar el campo 'volátil' para asegurarse de que cualquier otro subproceso vea el cambio. – LukeH

+0

Supongo que estaba pensando que si cambia la referencia mientras está en medio de ejecutar el método ContainsKey, ¿podría causar problemas? –

3

Es seguro si sólo se va a leer.

1

si todo el 'añadir' es completa antes de leer desde varios subprocesos, entonces está bien. El hecho de que simplemente no significa que su hilo sea seguro, lo cual no es cierto.

tal vez debería ReaderWriterLock usuario para sincronizar el acceso

2

Si se va a estar escribiendo datos al mismo tiempo (y que estaba utilizando .NET 4.0) entonces se podría utilizar el ConcurrentDictionary

Cuestiones relacionadas