Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

THREADSAFE GENERIC SORTEDLIST


Information sur la source

Catégorie :.NET Source .NET ( DotNet ) Classé sous : thread, safe, sortedlist, generic Niveau : Initié Date de création : 30/08/2006 Date de mise à jour : 07/09/2006 17:41:54 Vu / téléchargé: 5 828 / 124

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

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

  • 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; }
  • }
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 !
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

07 septembre 2006 17:41:54 :
version 1.1 ajout de l'enumeration pour encapsuler les methodes StartRead() et EndRead() selon les bons conseils de sashka_shurik :) mise en Zip

Commentaires et avis

signaler à un administrateur
Commentaire de sashka_shurik le 06/09/2006 15:06:29

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:-)

signaler à un administrateur
Commentaire de Dargos le 07/09/2006 12:37:31

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 :)

signaler à un administrateur
Commentaire de sashka_shurik le 07/09/2006 14:47:00

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.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

[C#] Visual 2005 Beta 1 & Thread safe operation [ par scoubidou944 ] Actuellement en train de tester la compatiblité de mes appli sur .NET 2005, je rencontre un petit problème d'accès entre threads et dont je ne sais pa les threads 2005 sont extrement minimisé [ par Fildomen ] sltj'ai toujours des problèmes avec la version 2005, et + précisement avec les threads, voilà mon problème:j'ai une form qui appel un sub, et ce sub c thread paramètre [ par abdoulax ] En fait voila mon pb :Je voudrai créer un thread qui appel une fonction en lui passant des paramètre.Si qlq1 connait aussi un bon site sur le dotnet o Variable globale [ par abdoulax ] Après avoir parcourue le forum je me suis rendu compte que les variable globale n'existé pas en C# :(Enfin voici mon problème :En fait j'aurai besoin Problème de thread [ par oualla_mohamed ] A partir d'un WinForm je lance un thread qui accède a un contôle de la WinForm.Le souci c'est qu'en je lance l'execution du programme à partir de Visu Pb avec SortedList [ par MHI ] J'ai un petit problème avec la déclaration d'un SortedList. Sur la ligne de 'ListPers.Clear' de la fonction 'ChargeListPers'. En exécution cela plante Pb affichage d'un sortedList dans un controle de liste [ par MHI ] J'aimerai charger un SortedList dans un controle qui liste les nom et prénoms et j'aimerai que ce controle me permette de récupérer le code correspond Source Safe et Doc automatique (à partir des commentaires) [ par Diamondduff ] J'en ai entendu parler, jamais utilis&#233;...Comment on utilise source safe? des pr&#233;cautions, conseils d'utilisation particuli&#232;re?Pareil po Problème de thread. Fenêtre et thread externe. [ par ivanoff1 ] Bonjour tout le monde !J'aimerais vous relater un probl&#232;me qui m'arrive dans mon projet en ce moment.J'ai une classe externe (Socket_Serveur) et Arret d'un thread [ par icedreamer ] Bonjour,J'essaye d'arreter proprement un thread de cette mani&#232;re :t.Abort();ce qui effectue bien l'arret du thread ...mais il m'affiche un messag


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,390 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.