2010-08-19 4 views
4

Notre application ajoute et supprime WPF (4.0) UserControls de sa fenêtre principale, et nous avons remarqué qu'ils ne sont pas récupérés Garbage (via WeakReferences qui ne renvoient jamais null). Il semble que si un UserControl a une liaison, cela se produit, même si le contrôle n'a jamais été ajouté à l'arborescence. La reproduction simple dans une application console suit:Pourquoi un UserControl WPF avec une liaison ne reçoit-il pas Garbage Collected?

programme principal

class Program 
{ 
    [STAThread] 
    static void Main(string[] args) 
    { 
     var obj = GetObj(); 
     var ctl = GetCtl(); 
     for (int x = 0; x < 4; x++) 
     { 
      GC.Collect(); 
      Thread.Sleep(1000); 
     } 
     bool objAlive = obj.IsAlive; 
     bool ctlAlive = ctl.IsAlive; 
     Console.WriteLine(objAlive + "-" + ctlAlive); 
     Console.ReadLine(); 
    } 

    private static WeakReference GetObj() 
    { 
     return new WeakReference(new object()); 
    } 

    private static WeakReference GetCtl() 
    { 
     return new WeakReference(new MyCtl()); 
    } 
} 

MyCtl User Control (le code est derrière standard et n'a pas été modifié

<UserControl <!--Snip Default Namespaces-->> 
    <TextBlock Text="{Binding Blah}" /> 
</UserControl> 

objAlive est false, mais ctlAlive est true Si la liaison est supprimée du contrôle XAML UserControl, les deux sont faux. Emory profiler, MyCtl traîne encore, mais je n'arrive pas à comprendre ce qui est référencé (des conseils sur la façon de le trouver en utilisant le jetBrains est apprécié).

Est-ce que ce comportement est attendu ou dois-je en faire plus pour nettoyer mes UserControls WPF?

Répondre

4

Dépend de ce à quoi vous vous liez.

Cela pourrait être un problème connu: http://support.microsoft.com/kb/938416

Êtes-vous lier à une classe personnalisée? Avez-vous implémenté INotifyPropertyChanged ou fait un DependencyProperty?

+0

Cela semble probable, nous avons implémenté INotifyPropertyChanged. –

Questions connexes