web-dev-qa-db-fra.com

Quand dois-je utiliser ConcurrentDictionary et Dictionary?

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?

36
Ashkru

"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" .

42
Jeff Bridgman

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.

2
Andrew

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.

1
Woody1193