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

Windows Forms Discussion :

Persistence d'un eventhandler


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut Persistence d'un eventhandler
    Bonjour,

    J'ai une form qui me sert de container dans lequel je j'ajoute des usercontrol que je crée à la volée. Ces UserControl sont créés puis détruits pis éventuellement récréés. A chaque création, j'assigne une procédure de ùn control dans un eventhandler d"une classe tiers.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Translations.Translator.OnCultureModified += new EventHandler(OnUpdateCulture);
    Pour détruire mon UserControl, je fais un Dispose().

    Question: Dans ce cas, qu'en est-il de mon EventHandler étant donné que la classe Translator n'est pas détruite et que c'est à elle que j'ai ajouté l' "évènement" ?

    Dois-je surcharger le dispose de mes UserControl pour "libérer" l'évènement , et y écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Translations.Translator.OnCultureModified -= OnUpdateCulture;
    ??

    Ou est-ce que cela va se faire automatiquement du fait du dispose ?

  2. #2
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    J'ai pas tout compris, c'est pas clair Mais généralement, si tu crées un objet A qui s'abonne à des événements d'une autre classe B, et que tu veux te débarrasser de A, il me semble en effet que tu dois supprimer les désabonnement dans le Dispose. Parce que tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monB.UnEvent = monA.UneMethode
    tu as un référence de B vers A ; et donc bien que tu l'aie disposé, A ne sera jamais supprimé par le GC car B a une référence vers lui.
    Faudrait jeter un coup d'oeil à la façon dont la DataGridView par exemple se désabonne de sa DataSource lorsqu'elle (la grille) est Disposée.

    Donc : si l'abonné a une vie plus courte que l'émetteur, il faut arrêter l'abonnement à la destruction de l'abonné.

    Me semble, je me goure peut être

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Par contre, il faut explicitement appeler Dispose sur l'abonné, sinon le "désabonnement" ne sera pas fait...

  4. #4
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Par contre, il faut explicitement appeler Dispose sur l'abonné, sinon le "désabonnement" ne sera pas fait...
    Cf cette discussion pour palier à ce problème, même si l'appel explicite à Dispose doit être préféré à chaque fois que c'est possible : http://www.developpez.net/forums/sho...d.php?t=521138

  5. #5
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    Perso, je trouve que l'explication et la solution fournies
    Ici
    sont plutôt convaincantes

    The Monz, Toulouse

  6. #6
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    Je me rends compte que je n'ai pas été très clair dans ma question. Pourtant, j'ai eu des réponses intéressantes. Merci à tous !

    Je reformule quand même pour préciser tout ça un peu mieux.

    J'ai créé un assistant sur une base de form avec des boutons précédent, suivant, etc.
    A coté, j'ai des UserControl personnalisés qui représentent chaque page de cet assistant.
    En fonction du UserControl actuellement affiché, et selon le bouton cliqué, j'ai une procédure qui:
    1. lit les données de la "page" en cours
    2. détruit cette page par un Dispose
    3. crée la nouvelle page et l'affiche dans la form.


    A coté de ça, j'ai une classe qui me permet de charger à la volée un fichier de traductions de chaînes de caractères. Quand cette classe (son instance) charge un fichier de langue différent de l'actuel, je déclenche un évènement OnUpdateCulture, lié à une procédure OnUpdateCulture dans chaque page (UserControl). Dans le constructeur de chaque UserControl, j'ai donc (par exemple):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            public ucDBMS()
            {
                InitializeComponent();
                DBMSType = DBMSTypes.dtAccess;
                Translations.Translator.OnCultureModified += new EventHandler(OnUpdateCulture);
            }
    où ucDBMS() est un des ces UserControl représentant une page de l'assistant.

    Quand je change de "page", je fais donc un code (générique) comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                foreach (Control item in pnlStages.Controls)
                {
                    if (item is ICommons) // all page UserControl implement ICommons
                    {
                        item.Dispose();
                        break;
                    }
                }
    pnlStages est un panel qui est le parent de chaque page.

    Ma question était donc plus précisément: Quand je fais un
    item.Dispose();
    qu'en est-il du
    Translations.Translator.OnCultureModified += new EventHandler(OnUpdateCulture);
    fait dans le constructeur du UserControl ?
    Est-ce que la référence est bien libérée ?

    D'après vos réponses et ce que j'ai lu dans les liens proposés ici, il semble que non.
    J'ai donc rajouté dans le code du Designer de ucDBMS() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                Translations.Translator.OnCultureModified -= OnUpdateCulture;
                base.Dispose(disposing);
            }
    qui devrait régler le problème.

    Encore merci à tous !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tomcat]persistence de session Tomcat
    Par coilolo dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 22/06/2004, 09h47
  2. [Persistance] Conseil cette couche ?
    Par Alec6 dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 16/06/2004, 11h21
  3. Processus persistant
    Par LeChip dans le forum Linux
    Réponses: 6
    Dernier message: 18/05/2004, 17h13
  4. [PaintBox] Persistance du dessin non créé dans onPaint
    Par princesse dans le forum C++Builder
    Réponses: 10
    Dernier message: 21/04/2004, 17h47
  5. [Persistence][Framework]Avis.
    Par quilo dans le forum Persistance des données
    Réponses: 5
    Dernier message: 10/09/2003, 14h55

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