est-il une différence entre:Generics et de verrouillage sur les collections
lock((IDictionary) _collection).SyncRoot)
ou
lock(_collection)
est-il une différence entre:Generics et de verrouillage sur les collections
lock((IDictionary) _collection).SyncRoot)
ou
lock(_collection)
Oui, le moniteur est pris sur un objet différent dans chaque, donc les deux ne sont pas équivalents fonctionnels . Le SyncRoot est exposé afin que vous puissiez le verrouiller pour l'accès des membres de la collection (et la collection utilise en interne la même chose pour le verrouillage). Cela permet au code de la collection et au code externe de convenir d'un objet verrou spécifique.
Cela dépend de l'implémentation de l'IDictionary. Si le dictionnaire renvoie "this
" comme SyncRoot
, les instructions sont équivalentes.
Il est vraiment facile de voir comment il est pas le même:
Monitor.Enter((IDictionary) _collection).SyncRoot));
Monitor.Exit(_collection);
Ce sera probablement lancer une exception disant que l'objet n'est pas la même chose.
Je recommanderais d'utiliser l'objet SyncRoot. L'IDictionary peut simplement retourner this
et il sera effectivement le même, mais ce n'est pas garanti.
Je crois qu'il y a deux questions.
Est-ce la même chose?
La réponse à cette question est "ça dépend". C'est la même chose si SyncRoot est implémenté en retenant "ceci". IDictionary est une interface et aucun contrat ne précise quel objet doit être retourné pour la propriété SyncRoot. L'implémenteur est libre de retourner "ceci" ou un objet complètement différent (IDictionary < TKey, TValue > fait cela).
Est-ce une bonne idée?
n ° implémenteurs IDictionary ont tendance à retourner un objet différent (tous les clasess de collecte standard ne). Donc, les chances sont contre vous dans la création d'une construction de verrouillage valide.
Vous devez utiliser une implémentation Thread Safe Dictionary native au lieu de verrouiller le dictionnaire entier.
http://devplanet.com/blogs/brianr/archive/2008/09/26/thread-safe-dictionary-in-net.aspx
Que voulez-vous dire "peut" être le même. Si l'implémentation est Dictionary –
leora
je l'ai dit dans ma réponse. "L'IDictionary peut simplement retourner ceci et il sera effectivement le même, mais ce n'est pas garanti." –