IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Web avec .NET Discussion :

Gestion des threads


Sujet :

Développement Web avec .NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 262
    Points : 95
    Points
    95
    Par défaut Gestion des threads
    Bonjour,
    dans mon application je gere des managers afin de simplifier mon code et d'optimiser. L'ensemble de mes managers hérite d'une classe qui me permet de créer mes managers avec le template singleton.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
           /// <summary>
            /// Stockage des différentes instance de managers, utilisées chacune par un thread
            /// </summary>
            protected static Dictionary<int, T> managers = new Dictionary<int, T>();
     
            /// <summary>
            /// Instance unique du manager pour toute la durée de vie du thread courant
            /// </summary>
            public static T Instance
            {
                get
                {
                    int threadId = Thread.CurrentThread.ManagedThreadId;
                    lock (managers)
                    {
                        if (!managers.ContainsKey(threadId))
                        {
                            managers.Add(threadId, new T());
                        }
                        return managers[threadId];
                    }
                }
            }
     
            /// <summary>
            /// Libération de l'instance liée au thread courant
            /// </summary>
            internal static void LibererInstance()
            {
                int threadId = Thread.CurrentThread.ManagedThreadId;
                lock (managers)
                {
                    if (managers.ContainsKey(threadId))
                    {
                        managers.Remove(threadId);
                    }
                }
            }
    Le prinicipe étant que les instances de mes différents managers sont créés au fil de l'eau si on en a besoin dans la page... et je libere mes managers sur l'évenement dispose de la page. Le problème est que dans le cas d'un response.redirect(..,true) par exemple le thread est avorté et donc je ne libere mes managers, peut etre dans d'autres cas.
    Et donc j'ai deux solutions soit je change de clé pour identifier mes managers soit j'arrive à les libérer juste avant le fin du thread, y a t'il un évenement sur le thread sur lequel je peux jouer à coup sur....
    par avance merci

  2. #2
    Membre confirmé Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Points : 577
    Points
    577
    Par défaut
    ça à l'air pas mal ton truc mais je ne comprends pas pourquoi gérer des manager par thread. Si le manager est threadsafe alors un pour toute l'appli suffit (c'est comme ça que ça marche avec Spring en java), s'il sont treadsafe mais propre à un utilisateur tu les mets en session. Et s'il sont pas thread safe tu en créé un par requête donc en asp.net : un par page, en propriété.
    Je suppute que les manager ne sont pas threadsafe et que tu veux minimiser leur création, est pertinant ? Sont-ils si coûteux ?

    Enfin tout cela ne répond par à ta question (car je suis peut-être passé à coté de particularité propre à ton application).

    La solution a ton problème c'est de laisser le garbage collector faire son job sur tes manager et ne pas utiliser le dispose et le LibererInstance pour cela il suffit de les gérer dans une collection de weakreference

    Et vérifier que la référence est toujours "vivante" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    protected static Dictionary<int, WeakReference> managers
     public static T Instance
            {
                get
                {
                    int threadId = Thread.CurrentThread.ManagedThreadId;
                    lock (managers)
                    { 
     
                       if(!managers[threadId].isAlive)
                       {
                               managers.remove(threadId);
                        }
     
                        if (!managers.ContainsKey(threadId))
                        {                      
                            managers.Add(threadId, new WeakReference(new T()));
                        }                  
                        return managers[threadId].Target;
                    }
                }
            }

Discussions similaires

  1. gestion des threads
    Par yanis97 dans le forum Langage
    Réponses: 6
    Dernier message: 20/04/2006, 12h41
  2. Gestion des Threads
    Par Nalfouille dans le forum MFC
    Réponses: 3
    Dernier message: 05/04/2006, 16h29
  3. Gestion des threads
    Par yanis97 dans le forum C++
    Réponses: 6
    Dernier message: 08/03/2006, 09h39
  4. GEstion des thread
    Par Julien Dufour dans le forum Access
    Réponses: 8
    Dernier message: 06/10/2004, 14h28
  5. [reseaux] Gestion des threads en perl
    Par totox17 dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 28/11/2002, 09h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo