4

Désolé si je manque quelque chose d'évident, mais j'essaie d'effacer les contrôles (une série de contrôles utilisateur) à partir d'un FlowLayoutPanel - (panelName) .Controls.Clear() ;. Malheureusement, cela ne semble pas appeler les destructeurs pour les objets sur le panneau - la colonne des objets utilisateur dans le gestionnaire de tâches ne cesse de monter et monter, jusqu'à ce qu'il frappe 10 000 et lance une excecption.Suppression des contrôles de FlowLayoutPanel n'appelant pas de destructeur?

Est-ce que quelqu'un sait ce que je manque ici?

+0

Destructeur est appelé par le GC. – adatapost

+1

Merci - malheureusement aucune preuve de ce qui se passe jamais. – eftpotrm

+0

J'avais le même problème avec l'effacement d'un tas de contrôles ZedGraph à partir d'un panneau flowlayout. J'ai finalement eu une "erreur en créant un handle de fenêtre", car il a également touché 10.000 poignées USER. –

Répondre

2

Pas une solution, mais une solution de contournement - les objets semblent être détruits par ce (brut, de la mémoire) Code:

while(FlowLayoutPanel.Controls.Count > 0) 
    FlowLayoutPanel.Controls.Remove(0); 
+1

Une légère variation est: while (FlowLayoutPanel.Controls.Count> 0) { FlowLayoutPanel.Controls.Clear(); } –

+0

Bon point, ce serait plus rapide serait pas :) – eftpotrm

+0

La solution maintenue toujours à l'utilisateur gère le nombre de plus en plus pour moi (contrôle disposant ZedGraph), cependant, si Ijust dispose manuellement le contrôle après l'avoir retiré de la FlowLayoutPanel, que l'a fixé à 100% pour moi (gardé l'utilisateur gère le compte constant) –

1

.NET n'a pas le concept de destructeurs. .NET a quelque chose appelé "finalizers" qui ressemble syntaxiquement à des destructeurs en C#. Pour plus d'informations, consultez le livre impressionnant de Jeff Richter sur le fonctionnement du CLR - CLR via C#.

Vous voudrez peut-être les objets à mettre en œuvre le modèle IDisposable, et appellent leur méthode Dispose() lorsque vous avez terminé avec eux.

+0

Désolé, le cerveau n'est pas engrené sur la langue, je veux dire les finaliseurs que je promets :-) De toute façon, ça ne s'appelle pas. Le contrôle personnalisé implémente IDisposable, qui fait tout ce qu'il est censé faire. J'ai essayé avec un finaliseur au cas, détruisant aussi les enfants. J'ai essayé d'appeler explicitement le garbage collector - dans tous les cas, les objets utilisateur marchent jusqu'à 10k et lancent une exception. – eftpotrm

+0

Quelle est l'exception? De ce que vous dites, je ne pense pas que vous compreniez entièrement les mécanismes des finaliseurs et l'interface IDisposable ... –

+0

Très probablement - erreur de création de handle de fenêtre. – eftpotrm

0

Essayez d'utiliser un profileur de mémoire , (par exemple ants), il vous dire ce qui maintient le contrôle en vie. Essayer de deviner ce type de problème est très difficile.

porte rouge donne 14 jours queue qui devrait être plus de suffisamment de temps pour virer de bord vers le bas ce problème et décider si un profileur de mémoire vous fournit la valeur à long terme.

Il y a beaucoup d'autres profileurs de mémoire sur le marché (par exemple .NET Memory Profiler) la plupart d'entre eux ont des essais libres, mais j'ai trouvé que les Red-Gate outils sont faciles à utiliser, ont donc tendance les essayer en premier.

2

la solution de eftpotrm ci-dessus encore gardé l'utilisateur manipule le nombre de plus en plus pour moi, cependant, si vous venez de jeter manuellement après avoir retiré le contrôle, qu'il fixe à 100% pour moi.

while (myFlowLayoutPanel.Controls.Count > 0) 
{ 
    var controltoremove = myFlowLayoutPanel.Controls[0]; 
    myFlowLayoutPanel.Controls.Remove(controltoremove); 
    controltoremove.Dispose(); 
}