2010-11-26 19 views
23

J'ai un static readonly dictionnaire. No Des modifications seront apportées à ce dictionnaire.Lecture seule Dictionnaire - plusieurs threads appelant la méthode .ContainsKey

J'ai plusieurs threads qui lisent dans ce dictionnaire en utilisant le .ContainsKey (Key). par exemple.

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]; 
     } 
    } 
} 

Y a-t-il des problèmes de threading dans cette opération?

Répondre

19

Si personne ne le mute: c'est très bien. S'il y avait modifications occasionnelles, alors peut-être regarder ReaderWriterLockSlim, ou (de préférence) éditer un instantané/copier et échanger la référence.

+0

Mais vous auriez encore besoin ReaderWriterLockSlim lors de l'échange de la référence, non? –

+1

@Mark: écrire une référence est garanti être atomique, mais je suppose que vous voudrez probablement marquer le champ «volatile» pour s'assurer que tous les autres threads voient le changement. – LukeH

+0

Je suppose que je pensais que si vous échangez la référence alors qu'il est au milieu de l'exécution de la méthode ContainsKey, cela pourrait causer des problèmes? –

3

Il est sûr si vous allez seulement lire.

1

Si tout le 'ajout' est terminé avant de lire plusieurs threads, alors c'est bien. Juste parce que son readonly ne signifie pas son thread sécurisé - ce qui n'est pas le cas.

Peut-être que vous devriez utilisateur ReaderWriterLock pour synchroniser l'accès

2

Si vous deviez être en train d'écrire des données en même temps (et que vous utilisiez 4.0 .NET), vous pouvez alors utiliser le ConcurrentDictionary