begin process at 2010 02 10 06:01:59
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

.NET

 > THREADSAFE GENERIC SORTEDLIST

THREADSAFE GENERIC SORTEDLIST


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :6 446 / 138

Auteur : Dargos

Ecrire un message privé
Site perso
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

Les Membres Club peuvent 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

 Sources du même auteur

Source avec Zip Source .NET (Dotnet) DBMAP - AUTOGÉNÉRER DES REQUETTES MULTIBASES
Source .NET (Dotnet) FILTRABLE GENERIC LIST

 Sources de la même categorie

Source avec Zip CHAT SERVER-CLIENT par abderrahmenbilog
Source avec Zip Source avec une capture Source .NET (Dotnet) SIMULATION DE CONSOLE POUR WINDOWS MOBILE par originalcompo
Source avec Zip Source .NET (Dotnet) BASE DE DONNÉES EN XML par DanMor498
Source avec Zip Source avec une capture Source .NET (Dotnet) SIMPLECONV - APPLICATION DE CONVERSION MONÉTAIRE AVEC TAUX E... par Jeffrey_
Source avec Zip Source .NET (Dotnet) TRAITEUR D'IMAGE (MINI) par ycyril

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) CALCUL D'EMPREINTES DE FICHIERS par lex35
Source .NET (Dotnet) EACHPARALLEL par SoaR245
Source .NET (Dotnet) EVENTHANDLERS GÉNÉRIQUES par ricklekebekoi
Source avec Zip Source .NET (Dotnet) TRAITER UN FOREACH EN PARALLÈLE par maitredede
Source avec Zip Source .NET (Dotnet) UN RICHTEXTBOX À PARTIR D'UN MEMORYSTREAM par Robert33

Commentaires et avis

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

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

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

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,983 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales