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

C# Discussion :

Garbage collector / Fonctionnement de la propriété Disposing


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 92
    Par défaut Garbage collector / Fonctionnement de la propriété Disposing
    Bonjour.
    J'essaye de comprendre le fonctionnement de la propriété Disposing.
    J'ai un Windows form avec un bouton nommé "buttonDEBUG1" et un autre nommé "buttonDEBUG2".
    Dans l'événement click de buttonDEBUG1 j'ai mis le code qui suit. Je ne comprend pas pourquoi le second message ne s'affiche pas. Comment tester qu'un dispose a été effectué sur ce controle ?


    private void buttonDEBUG1_Click(object sender, EventArgs e)
    {
    Button toto = this.buttonDEBUG2;

    toto.Dispose();
    if (toto == null)
    {
    MessageBox.Show("Ce message ne s'affiche pas -> normal");
    }
    if (toto.Disposing)
    {
    MessageBox.Show("Par contre je ne comprends pas pourquoi celui-ci ne s'affiche pas");
    }


    }

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    bah cela me semble logique, au moment ou tu fait le test ton objet n'a pas encore été supprimé.

    essayes avec :
    Tu peux même faire une boucle while dessus si tu veux que ton programme attende la suppression de ton objet.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 92
    Par défaut Garbage collector
    C'est parfait.
    Cela marche.

    Donc Disposing veut réellement dire "en cours de suppression" et Disposed "supprimé" ?

    J'ai une autre petite question.

    Si j'ai 2 variables A et B référençant mon controle bouton et que je fait un A.Dispose() . Mon controle bouton est bien "disposed" mais pas encore supprimé du garbage collector (vu que ma variable B le référence toujours). Que ce passe t-il alors si j'appelle depuis B une méthode du bouton ? Est-ce que j'ai une exception ?

  4. #4
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Aucune idée, mais d'après ce que je me souviens sur le fonctionnement du Garbage Collector, lorsque tu appelles la méthode dispose tu précise à ce dernier qu'il peut détruire l'objet en question.
    Donc si tu appelles une méthode de l'objet juste après le dispose, en fonction de la vitesse du GB et de l'exécution de ton programme, je suppose que tu pourrais te retrouver avec une exception du genre "pointeur null exception".
    Mais en règle général, on n'appelle pas les méthodes des objets que l'on viens de détruire, on les appelle avant .

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 92
    Par défaut Garbage collector
    C'est qu'en fait, dans mon appli, j'utilise des composants utilisateurs utilisés pour représenter graphiquement des données (genre schéma). Ces composants prennent en paramètre, dans leur constructeur, une interface vers un objet chargé d'effectuer cette représentation graphique de données en implémentant une méthode AfficherRepresentationGraphique().

    Sur la méthode click de mes composant j'ai un appel à (objet.AfficherRepresentationGraphique()).

    Dans l'implémentation de cette méthode appellée le développeur peu tout à fait supprimer les composants graphiques et donc le composant graphique qui a lui même provoqué l'appel.

    C'est pour cela que je cherche quel est le test que je doit faire, dans mon composant, après l'appel à objetparent.AfficherRepresentationGraphique() pour savoir s'il existe.

    Actuellement je fais, dans ce composant :
    objetparent.AfficherRepresentationGraphique();
    if ((!this.Disposing) && (!this.IsDisposed) && (this != null))
    {
    // Mon code qui suit est ajouté ici
    }

    Je pense que le this!null est inutile mais est ce que le this.Dispose() l'est aussi ?

    Je précise que je suis dans le composant qui est censé être peut être supprimé. C'est d'ailleurs une phrase bizarre qui n'a de sens qu'avec un langage utilisant un garbage collector car comment être dans un contexte d'un objet qui exécute du code alors qu'il est supprimé. Mais, à priori, avec le garbage collector c'est possible si :

    A est un objet
    A appelle une méthode de B qui supprime A
    A continu le déroulement de son code

    Qu'en pensez-vous ?

  6. #6
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Disons que chez moi je n'ai que :
    Dispose() qui est une méthode.
    disposed qui représente l'événement appelé.
    Disposing et IsDipose qui sont deux propriétés.

    Donc je suis surpris que le code compile avec chez cela ne compile pas .

    Je commencerais par mettre les parenthèses, mais dans ce cas, tu fais appelle à la méthode dispose() et tu supprimes toi même ton objet .

    Donc je dirais qu'il est indispensable de le retirer .

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    Citation Envoyé par sandre Voir le message
    Si j'ai 2 variables A et B référençant mon controle bouton et que je fait un A.Dispose() . Mon controle bouton est bien "disposed" mais pas encore supprimé du garbage collector (vu que ma variable B le référence toujours). Que ce passe t-il alors si j'appelle depuis B une méthode du bouton ? Est-ce que j'ai une exception ?
    a et b sont des pointeurs vers l'objet lui meme
    a.dispose fait que l'objet est détruit
    b plantera donc quoi que tu veuilles faire avec, le pointeur pointant sur un objet détruit
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    De façon général tu ne peux pas empêcher les développeurs d'être stupide .
    Si j'ai bien compris tu crées une classe qui peut être instancié par d'autre développeurs que toi, une sorte de bibliothèques en fait.
    Dans ce cas ce n'est pas à toi de vérifier que l'objet correspondant à l'instanciation de ta classe est encore valide. C'est au dév de ne pas faire n'importe quoi .
    Par contre si tu veux faire quelque chose de spéciale (supprimer des objets que tu as créés) au moment du dispose de ta classe (enfin de l'instance de ta classe) tu peux surcharger la méthode Dispose() .

  9. #9
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    je fais aussi des classes qui seront utilisé par d'autres developpeurs
    sur la plupart des appels publiques je test si je suis disposed, au quel cas je sors
    et aussi sur les évènement timer, que j'ai deja vu se produire après dispose

    mais si tu fais pas trop de multithreading, il y a deja moins de problème, si un dev fait dispose et qu'il appelle ensuite l'objet il se fait jeter direct sans passer par ton code
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

Discussions similaires

  1. [Python 3.X] Garbage collector : suivre le fonctionnement - rapidement
    Par emmanuel_dumas dans le forum Général Python
    Réponses: 0
    Dernier message: 16/09/2014, 09h22
  2. Destruction d'objets Dispose() Garbage Collector
    Par Pascal_F dans le forum VB.NET
    Réponses: 14
    Dernier message: 04/10/2013, 13h52
  3. Comment fonctionne le garbage collector sous tomcat6
    Par norten dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 25/03/2009, 14h34
  4. [JVM] les objets et le Garbage collector
    Par Kurdran dans le forum Général Java
    Réponses: 7
    Dernier message: 02/06/2005, 16h57
  5. [Language]Garbage collector
    Par GETah dans le forum Langage
    Réponses: 2
    Dernier message: 23/03/2005, 15h18

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