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 ... p>
4 Réponses :
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. P>
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>
J'ai écrit un dictionnaire simultané moi-même (avant le fichier Qu'est-ce que j'ai fait était d'utiliser un C'est aussi une bonne idée de modifier le comportement de system.collections.concurrent code> 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 code> et
supprimer code> ou quelque chose comme ça. P>
ReaderReaderLock code> (in .NET 3.5 et ci-dessus, vous pouvez accéder à
ReaderWriterLLockSlim CODE>) et appelez
AcquireReaderLock code> pour toutes les opérations "lire" (comme
ceci [tkey] code>,
contient contenant code>, etc.) et
acquirewriterlock code> pour toutes les opérations "écriture" (comme
Ceci [tkey] = valeur code>,
Ajouter code>,
supprimer code>, etc.). Assurez-vous d'envelopper tous les appels de ce type dans un
Essayez code> /
enfin code> Bloc, libérant le verrou dans le
enfin p>. P>.
getenumerator code> 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. P>
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. P>
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. P>
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.
Voici une implémentation simple qui utilise un verrouillage Sane (bien que < Code> Interlocké CODE> serait probablement plus rapide): http://www.tech.windowsApplication1.com/content/the- Synchronisé-Dictionnaire-DictionaryHey -key-Tvalue P>
essentiellement, créez simplement un charront de dictionnaire / décorateur et synchroniser l'accès à toutes les actions de lecture / écriture. P>
Lorsque vous passez à .NET 4.0, remplacez simplement toutes vos surcharges avec des appels délégués au concours sous-jacent. P>