Threadsafe generic sortedlist

Soyez le premier à donner votre avis sur cette source.

Vue 9 090 fois - Téléchargée 246 fois

Description

problemes d'acces a la sortedlist (C#2.0) lorsqu'un autre thread ajoute un item dans celle ci...
en effet, le GetEnumerator() a changé...
et pire ! quand 2 threads ajoutent la meme clef en meme temps, on arrive meme a avoir des clefs dupliquées !!!
une solution simple aurait été de Locker la liste dans tous les cas...
mais en .net chaqu'un devra attendre son tour pour pouvoir acceder en lecture a la sortedlist
l'acces en lecture doit rester multiThread
mais des que l'on veut modifier la sortedlist, l'acces en lecture et ecriture sur les autres threads est bloqué
voici le code que j'ai produit.
il marche mais je me demande comment l'ameliorer parce qu'il ne me conviens toujours pas ...
donc n'esitez pas sur les commentaires !!!

Source / Exemple :


SyncSortedList<TKey, TValue>
    {
        TValue this[TKey Key] { get; set; }
        void Add(TKey Key, TValue Value);
        bool Remove(TKey Key);
        void Clear();
        int Count { get; }

        bool ContainsKey(TKey Key);
        bool ContainsValue(TValue Value);

        System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<TKey, TValue>> GetEnumerator();
        System.Collections.Generic.IEnumerable<TKey> Keys { get; }
        System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<TKey, TValue>> Reverse { get; }
        System.Collections.Generic.IEnumerable<TValue> Values { get; }
    }

Conclusion :


on peut maintenant utiliser la classe SyncSortedList presque comme une SortedList normale !

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
4
Date d'inscription
samedi 15 avril 2006
Statut
Membre
Dernière intervention
9 avril 2007

J'ai envoye un message a ta boite.

Pour les lecteurs interesses dans le suhet une question:
Si on appelle StartRead() quand on cree ou execute le premier fois le IEnumerator et apres quelque iteration le foreach() termine sans arriver a la fin de sequence, peut on verifier que le foreach vient de terminer? peut on verifier si la reference cree par foreach en question est toujours accessible ?

De ma part la seule solution envisageable est d'avoir un liste interne de "weak references" dans le class que vont retracer la creation de tout IEnumerator et qui vont aider a verifier si un "strong reference" existe qq ailleur dans le code chaque fois que un write est applee.
Messages postés
13
Date d'inscription
mardi 18 avril 2006
Statut
Membre
Dernière intervention
27 mars 2008

sashka_shurik :
>Tu peux implementer ton propre IEnumerator qui serait l'enfant de IEnumerator de C# et qui aurait tout le code necessaire pour la protection thread.
>la migration d'un class generique vers le tien(et vise versa) se ferrait facilement.

effectivement !
mais la, je ne sais comment faire : dans le foreach, il y a un appel au IEnumerator a chaque boucle. d'où le fait que je bloques au debut du foreach, et que je libere à la fin...
peux tu m'en dire plus sur ceci ? (implementer ton propre IEnumerator)
en tout cas merci pour ce bon commentaire :)
Messages postés
4
Date d'inscription
samedi 15 avril 2006
Statut
Membre
Dernière intervention
9 avril 2007

Tres interessant :-) comme code
Suggestion(s):
Dans la fonction "public TValue this[TKey Key]" dans le "set" et le "get" tu peut aussi verifier pour lecture et/ou ecriture.
Tu peux implementer ton propre IEnumerator qui serait l'enfant de IEnumerator de C# et qui aurait tout le code necessaire pour la protection thread.
Si ces deux choses sont fait. Tu peut rendre StartRead et EndRead prives et donc le class serait tout a fait le meme que le generique SortedList de point de vue utilisateur. De plus, la migration d'un class generique vers le tien(et vise versa) se ferrait facilement.
Autrement, une super bonne idee :-) je vais peut etre l'utiliser dans mon projet:-)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.