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

Framework .NET Discussion :

Libération de ressources non managées


Sujet :

Framework .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3
    Par défaut Libération de ressources non managées
    Bonjour,

    J'ai une classe Log avec un StreamWriter ouvert sur un fichier constant.

    J'ai une classe C qui instancie Log a la création et l'exploite dans plusieurs méthodes.

    Je détruit C, puis le re-crée. Le premier StreamWriter n'est pas encore libérer, le fichier est verrouillé "en cours d'utilisation"

    Je suppose qu'il faut implémenter un Dispose dans Log mais je ne souhaite pas que C doive l’appeler explicitement (il ne sera pas quand le faire)

    Je cherche:
    - Soit une prise en charge automatique du Dispose() dès la destruction de la référence,
    - Soit une méthode permettant qu'un objet soit détruit immédiatement (genre VB6 ),
    - Soit toute autre bonne pratique que je n'aurais pas encore trouvé.

    Merci de votre aide.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 193
    Par défaut
    Je détruit C avec C.Dispose() qui appelle Log.Dispose();

  3. #3
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Salut,
    Pour faire les choses bien, ta classe Log et ta classe C doivent toute deux implémenter IDisposable (et donc la méthode Dispose qui va avec).
    Dans l'implémentation de C.Dispose tu appel Log.Dispose. Dans Log.Dispose tu appel StreamWriter.Dispose.
    Tu dis que tu ne veux pas faire d'appel direct car la classe ne saura pas quand l'appeler, mais elle le sait : elle doit appeler le dispose lorsqu'elle-même est disposée.
    Ainsi, pour détruire C tu appel la méthode C.Dispose(), qui appelera la méthode Log.Dispose(), qui appelera la méthode StreamWriter.Dispose().
    C'est la seule vraie méthode.
    Dans certains cas rares, qui trahissent souvent un problème plus grave, il peut être utile d'appeler System.GC.Collect() afin de forcer le garbage à faire son boulot immédiatement.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3
    Par défaut
    Merci de votre aide.

    J'ai oublier de préciser: CSharp.

    Je comprend qu'en chainant les Dispose on s'en sort mais,

    1) Je ne sais pas a quel moment je n'aurait plus besoin de la ressource. Je répond a des événements utilisateurs, et puis je n'existe plus. Rien entre les deux.

    2) Conceptuellement, la classe consommatrice n'a pas a savoir que j'utilise une ressource non managé et ne devrait pas avoir a gérer un Dispose.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 193
    Par défaut
    Soit la classe consomatrice fait le dispose
    Soit tu ouvres/fermes le fichier a chaque fois

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3
    Par défaut
    Citation Envoyé par BenoitM Voir le message
    Soit tu ouvres/fermes le fichier a chaque fois
    C'est une option, mais j'ai du mal a estimer le cout. Il ne doit pas être négligeable.

Discussions similaires

  1. ressources non managés
    Par TaymouWan dans le forum Langage
    Réponses: 1
    Dernier message: 03/11/2010, 19h52
  2. nettoyer les ressources non managées
    Par TaymouWan dans le forum VB.NET
    Réponses: 0
    Dernier message: 23/09/2010, 19h04
  3. Ressources non managés?
    Par razrman dans le forum VB.NET
    Réponses: 5
    Dernier message: 17/03/2010, 15h08
  4. [C#, .net 2.0] Libération de mémoire non managée
    Par SesechXP dans le forum C++/CLI
    Réponses: 2
    Dernier message: 08/12/2006, 09h00
  5. [TOMCAT] ressource non disponible
    Par mousstik dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 12/10/2004, 12h45

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