Question

Lecture de la documentation sur le msdn pour les dictionnaires: & Les membres statiques publics (partagés dans Visual Basic) de ce type sont thread-safe. La sécurité des threads n'est garantie pour aucun membre d'instance. & Quot;

Celles-ci signifient qu'avec un dictionnaire comme celui-ci:


static object syncObject = new object();
static Dictionary<string,MyObject> mydictionary= new Dictionary<string, MyObject>();

Est-il inutile de faire quelque chose comme le code ci-dessous?


lock (syncObject)
{
   context = new TDataContext();
   mydictionary.Add("key", myObject);
}
Était-ce utile?

La solution

Il fait référence aux méthodes statiques sur la classe elle-même. L'instruction est en réalité une documentation standard ajoutée à la plupart des classes. Le dictionnaire & Lt; & Gt; la classe n’expose en réalité aucune méthode statique.

Vous devrez sérialiser l'accès à votre classe de dictionnaire à l'aide du mot clé lock ou peut-être même d'un ReaderWriterLock. Le filetage est un sujet assez complexe et le mot clé lock n'est pas toujours approprié. Joe Duffy & "; Programmation simultanée sous Windows < !> quot; cela va très loin dans la protection des ressources d'applications partagées.

Autres conseils

Vous interprétez mal & "; public statique membres de ce type &"; en tant que & "; public statique instances de ce type &";

Cela signifie que si vous appelez la méthode Add (une méthode d'instance), vous devez vous assurer que vous disposez d'un accès exclusif au Dictionnaire en utilisant votre propre sémantique de verrouillage ou de sérialisation. De mauvaises choses pourraient se produire si deux threads modifient l'état de votre dictionnaire en même temps, et il est de votre responsabilité de vous assurer que cela ne se produise pas. Il n'y a rien dans la méthode Add de Dictionary qui ferait ce verrouillage pour vous.

Si, toutefois, vous appelez une méthode statique dans Dictionary (il n’y en a pas d’utile), alors tout irait bien sans verrou.

Il s'agit de la règle générale pour tous les types .NET dans la BCL.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top