2 votes

Comment nettoyer au mieux les ressources d'une application .NET ?

Quels sont les meilleurs moyens ou les meilleures pratiques pour s'assurer qu'une application Winforms .NET libère toutes les ressources qu'elle a consommées au cours du cycle de vie de son exécution ?

En particulier, la libération des poignées de fichiers et des images.

Gracias.

2voto

vanslly Points 2219

Si votre implémentation est en boîte blanche, l'appel à Close sur le flux de fichiers devrait fermer son flux de mémoire.

Si la classe implémente IDisposable, il suffit d'utiliser le bloc using en C# pour que la ressource soit éliminée :

using (var foo = new Foo())
{
    // Do some stuff to foo
}

Si vous écrivez un wrapper qui consomme beaucoup de mémoire, je vous recommande d'implémenter la fonction IDisposable .

1voto

amazedsaint Points 5712

Suivez ces règles du pouce

1 - Dans la mesure du possible, utilisez l'utilisation pour vous assurer que vous disposez correctement des objets (en particulier lorsque vous travaillez avec des flux et tout). Vous pouvez appliquer 'using' pour disposer de n'importe quel objet IDisposable

using (SteramReader reader=new StreamReader(filePath)) 
{
     //Do your stuff here
}

Lorsque vous disposez des flux, Close sera appelé automatiquement.


2 - Si vous n'utilisez pas de composants gérés, assurez-vous que vous les nettoyez lorsque vos objets sont éliminés ou lorsque vos formulaires sont fermés.


3 - Si vous utilisez trop la sérialisation XML, assurez-vous d'utiliser les constructeurs appropriés, sinon cela peut provoquer une fuite de mémoire -. http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx


4 - Laissez tout le reste au ramasseur de déchets.

1voto

Ash Points 31541

Si vous écrivez la classe qui fait référence à des fichiers/images, il est de votre responsabilité de fournir un mécanisme pour que ceux-ci soient libérés.

Pour toutes les applications .NET (pas seulement WinForms), l'implémentation d'IDisposable sur tous les types qui contiennent des références à de grandes ressources de fichiers/mémoire est toujours un bon début.

Si vous utilisez des types de cadres qui accèdent aux ressources, alors, comme d'autres l'ont dit, les blocs d'utilisation constituent une solution élégante.

Il est également possible de forcer le ramasseur d'ordures à se débarrasser des types au moment où vous lui demandez de le faire (déterministe), mais il est fortement recommandé de ne pas le faire et de laisser le ramasseur d'ordures décider lui-même pour améliorer les performances et la gestion de la mémoire.

Enfin, comme l'appel à Dispose (directement ou via l'utilisation) est effectué par l'utilisateur de vos types, il est essentiel de le documenter clairement (commentaires XML, etc.).

Voir ceci question précédente sur le SO pour plus de détails

0voto

Ray Hidayat Points 7961

Si vous le pouvez, mettez-les en utilisant des blocs :

using(Bitmap bitmap = new Bitmap(path)) {
    ...
}

Ainsi, la libération des ressources du bitmap sera garantie à la fin du bloc d'utilisation. Sinon, utilisez le motif Dispose : http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

0voto

Oscar Cabrero Points 2922

1 - L'implémentation de l'interface IDisposable vous aidera à gérer les ressources non gérées. 2 - Si vous accédez à des fichiers par programme, en cas d'erreur, essayez de fermer les fichiers ou les flux dans une déclaration try{}catch{}finally pour éviter les verrous sur cette ressource. 3. le Garbage Collector prendra les ressources la plupart du temps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X