Je suis toujours confus sur lequel choisir. Comme je le vois, j'utilise Dictionary
sur List
si je veux deux types de données comme Key
et Value
afin que je puisse facilement trouver une valeur par son key
mais je suis toujours confus si je dois utiliser un ConcurrentDictionary
ou Dictionary
?
Avant de m'en vouloir de ne pas avoir fait beaucoup de recherches dans ce que j'ai essayé, mais il semble que Google n'a vraiment rien sur Dictionary
vs ConcurrentDictionary
mais a quelque chose sur chacun individuellement.
J'ai déjà posé la question à un ami, mais tout ce qu'ils ont dit est: "utilisez ConcurrentDictionary
si vous utilisez beaucoup votre dictionnaire dans le code" et je ne voulais pas vraiment les harceler pour l'expliquer plus en détail. Quelqu'un pourrait-il développer cela?
"Utilisez ConcurrentDictionary si vous utilisez beaucoup votre dictionnaire dans le code" est une sorte de vague conseil. Je ne vous blâme pas pour la confusion.
ConcurrentDictionary
est principal pour une utilisation dans un environnement où vous mettriez à jour le dictionnaire à partir de plusieurs threads (ou tâches asynchrones). Vous pouvez utiliser un Dictionary
standard à partir de autant de code que vous le souhaitez s'il provient d'un seul thread;)
Si vous regardez les méthodes sur un ConcurrentDictionary, vous remarquerez des méthodes intéressantes comme TryAdd
, TryGetValue
, TryUpdate
et TryRemove
.
Par exemple, considérez un modèle typique que vous pourriez voir pour travailler avec une classe Dictionary
normale.
// There are better ways to do this... but we need an example ;)
if (!dictionary.ContainsKey(id))
dictionary.Add(id, value);
Cela a un problème entre la vérification de la présence d'une clé et l'appel de Add
un thread différent pourrait appeler Add
avec ce même id
. Lorsque ce thread appelle Add
, il lèvera une exception. La méthode TryAdd
gère cela pour vous et retournera un vrai/faux vous indiquant si elle l'a ajouté (ou si cette clé était déjà dans le dictionnaire).
Donc, à moins que vous ne travailliez dans une section de code multi-thread, vous pouvez probablement simplement utiliser la classe Dictionary
standard. Cela étant dit, vous pourriez théoriquement avoir des verrous pour empêcher l'accès simultané à un dictionnaire; cette question est déjà traitée dans "Verrouillage du dictionnaire vs ConcurrentDictionary" .
La principale raison d'utiliser ConcurrentDictionary
par rapport à la normale Dictionary
est la sécurité des threads. Si votre application obtient plusieurs threads en utilisant le même dictionnaire en même temps, vous avez besoin du thread-safe ConcurrentDictionary
, ceci est particulièrement vrai lorsque ces threads écrivent ou construisent le dictionnaire.
ConcurrentDictionary
est utile lorsque vous devez accéder à un dictionnaire sur plusieurs threads (c'est-à-dire multithreading). Les objets Vanilla Dictionary
ne possèdent pas cette capacité et ne doivent donc être utilisés que d'une seule manière.