2012-08-13 5 views
1

Je souhaite disposer d'un contrôle que j'ajoute dynamiquement à mon application. Le garbage collector ne récupère pas l'objet après l'avoir quitté de son contrôle parent, et il a d'énormes bitmaps et membres privés de géométrie.Fuite de mémoire WPF avec contrôle personnalisé

Je veux être en mesure de faire quelque chose comme ceci:

foreach (ScrollItem mylabel in canvas1.Children) 
{ 
    if (mylabel.bRemove == true) 
    { 
     canvas1.Children.Remove(mylabel); 
     mylabel = null; // or mylabel.Dispose(); 
    } 
} 

canvas1 ne peuvent pas avoir des éléments nuls dans un UIObjectCollection je ne peux pas le mettre à null, et si je viens Remove() il la poubelle le collecteur ne le collecte pas.

J'ai essayé de faire quelque chose comme:

myobj = mylabel; 
canvas1.Children.Remove(mylabel); 
myobj = null; 

mais cela ne fonctionne pas non plus.

+1

Avez-vous branché des écouteurs d'événements vers/à partir de ceux-ci? Ceux-ci sont souvent une cause pour les références restantes, empêchant ainsi le nettoyage des ordures. –

+0

non, mais je l'ai dans une minuterie ... où theres un appel à cette minuterie toutes les 50ms environ, peut-être que le GC voit ses objets (similaires) toujours regardant – jeffbeat

+0

Je n'ai pas beaucoup d'expérience avec WPF et les contrôles dynamiques , mais n'avez-vous pas à Disposer le contrôle créé dynamiquement? Libérez également toutes les connexions entre le contrôle créé dynamiquement et le temporisateur. Où est la minuterie? – Maarten

Répondre

3

Tant qu'il n'y a aucune référence à votre objet, le GC le recueillera. Vérifiez votre application pour toute référence supplémentaire à votre objet. Cela peut généralement être des abonnés à un événement. Vous pouvez également utiliser un profileur de mémoire .NET pour voir ce qui empêche votre objet d'être GCé.