8
votes

Dictionnaire simultané dans c #

J'ai besoin de mettre en œuvre un dictionnaire simultané car .NET ne contient pas de mise en œuvre simultanée pour les collections (car .net4 sera contenant). Puis-je utiliser pour cela "Bibliothèque de filetage d'alimentation" de Jeffrey Richter ou actuellement mis en œuvre des variantes ou des conseils pour la mise en œuvre? Merci ...


0 commentaires

4 Réponses :


3
votes

Vous pouvez utiliser réflecteur pour afficher le code source de la mise en œuvre simultanée de .NET 4.0 RC et copiez-le à votre propre code. De cette façon, vous aurez le moins de problèmes lors de la migration vers .NET 4.0.


3 commentaires

Sauf s'il utilise des nouvelles fonctionnalités qui ne sont pas disponibles dans DotNet 3.5. Et il pourrait y avoir des problèmes de droit d'auteur ici.


Je vous découragerais à l'inverse-ingénierie du 4.0 FX .. Ceci est un problème solvable / résolu pour lequel il existe des solutions connues / testées. Vous pouvez utiliser le 4,0 fx pour inspiration, mais sinon, je ne pense pas que ce soit un avis sonore.


On dirait que c'est le fichier .NET V4 IPL refactored: code.google.com/p/codesmith/source/browse/trunk/templates/.../a>



3
votes

J'ai écrit un dictionnaire simultané moi-même (avant le fichier system.collections.concurrent espace de noms); Il n'y a pas grand chose à ça. Vous voulez fondamentalement simplement sûr que certaines méthodes ne sont pas appelées en même temps, par exemple, contient et supprimer ou quelque chose comme ça.

Qu'est-ce que j'ai fait était d'utiliser un ReaderReaderLock (in .NET 3.5 et ci-dessus, vous pouvez accéder à ReaderWriterLLockSlim ) et appelez AcquireReaderLock pour toutes les opérations "lire" (comme ceci [tkey] , contient contenant , etc.) et acquirewriterlock pour toutes les opérations "écriture" (comme Ceci [tkey] = valeur , Ajouter , supprimer , etc.). Assurez-vous d'envelopper tous les appels de ce type dans un Essayez / enfin Bloc, libérant le verrou dans le enfin . .

C'est aussi une bonne idée de modifier le comportement de getenumerator légèrement: plutôt que d'énumérer sur la collection existante, en apportez-en une copie et permet une énumération à ce sujet. Sinon, vous ferez face à des impacts potentiels.


0 commentaires

4
votes

J'ai écrit un wrapper à fil de sécurité pour la classe de dictionnaire normale qui utilise verrouillé pour protéger le dictionnaire interne. En verrouillé est de loin le mécanisme de verrouillage le plus rapide disponible et donnera beaucoup de meilleures performances que ReaderWrattreLlockSlim, moniteur ou n'importe laquelle des autres serrures disponibles.

Le code a été utilisé pour implémenter un Cache classe pour Fasterflect , qui est une bibliothèque pour accélérer la réflexion. En tant que tel, nous avons essayé un certain nombre d'approches différentes afin de trouver la solution la plus rapide possible. Fait intéressant, les nouvelles collections simultanées de .NET 4 sont sensiblement plus rapides que ma mise en œuvre, bien que les deux soient assez rapides, par rapport aux solutions utilisant un mécanisme de verrouillage moins performant. La mise en œuvre de .NET 3.5 est située dans une région conditionnelle de la moitié inférieure du fichier.


2 commentaires

J'ai examiné votre page d'accueil de Fasterflect et j'ai vu un exemple de classe de personne à compter cette instance dans la classe. Cela ne vous ouvrirait-t-il pas aux problèmes de concurrence car il n'y a pas de verrouillage? J'ai récemment fait une certaine vérification que c # ++ / - opérateurs ne sont pas atomiques et je n'ai vu aucune information qui contredit ma compréhension.


La classe de la personne n'est qu'un exemple de classe utilisée pour montrer comment Fasterflect peut être utilisé. Il n'est pas censé être le fil sûr. Le code que je faisais appelé ci-dessus est la classe de cache située dans le projet principal Fasterflect. Cliquez sur le lien de cache ci-dessus pour accéder directement au navigateur source sur CodePlex.



0
votes

Voici une implémentation simple qui utilise un verrouillage Sane (bien que < Code> Interlocké serait probablement plus rapide): http://www.tech.windowsApplication1.com/content/the- Synchronisé-Dictionnaire-DictionaryHey -key-Tvalue

essentiellement, créez simplement un charront de dictionnaire / décorateur et synchroniser l'accès à toutes les actions de lecture / écriture.

Lorsque vous passez à .NET 4.0, remplacez simplement toutes vos surcharges avec des appels délégués au concours sous-jacent.


0 commentaires