2010-05-17 5 views
3

Est-ce que quelqu'un sait comment résoudre la fuite de mémoire dans SL3 avec ChildWindow?Silverlight ChildWindow Memory Leak

Se reporter à l'extrait de code ci-dessous:

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     var window = new ChildWindow(); 

     window.Closed += new EventHandler(window_Closed); 

     window.Show(); 
    } 

    void window_Closed(object sender, EventArgs e) 
    { 
     ((ChildWindow)sender).Closed -= new EventHandler(window_Closed); 

     WeakReference reference = new WeakReference(sender); 

     GC.Collect(); 

     GC.WaitForPendingFinalizers(); 

     bool isControlAlive = a.IsAlive; 
    } 

Il affiche toujours comme toujours « en vie » - et quand je surveille l'instance iexplore dans le Gestionnaire des tâches - la mémoire continue d'augmenter chaque fois que j'ouvrir et fermer la Fenêtre enfant.

Aidez-nous s'il vous plaît.

Merci.

Chris

Répondre

4

Il n'y a pas de solution officielle mais pour autant que je sache. This page décrit la nature de la fuite de mémoire:

... [ChildWindow] est abonnée aux multiples fois RootVisual_GotFocus, mais il ne désinscrit une fois pendant près. Cela entraîne le maintien permanent de ChildWindow en mémoire attachée à l'événement GotFocus du RootVisual.

par la section des commentaires, vous pouvez modifier le code Silverlight Toolkit comme suit pour résoudre le problème:

Modifier la fonction ChildWindow_LostFocus sur ChildWindow.cs (ligne 731) pour soustraire l'auditeur de RootVisual_GotFocus avant d'ajouter nouveau:

Application.Current.RootVisual.GotFocus -= this.RootVisual_GotFocus; 
Application.Current.RootVisual.GotFocus += this.RootVisual_GotFocus; 
+0

Notez qu'il peut être plus que l'événement GotFocus qui est à l'origine d'un problème. L'événement SizeChanged semble également être un coupable .. –

+0

J'ai lu le commentaire sur l'événement GotFocus - n'était pas au courant de l'événement SizeChanged. Il s'agit donc essentiellement d'un gestionnaire d'événements dont il faut se désabonner. Il s'agit simplement de passer en revue le code de la classe ChildWindow pour savoir de quel événement il s'agit. – Chris

+0

Ce problème semble être résolu dans Silverlight 5. Il existe un champ 'private bool _attachedRootVisualListener' dans la classe' System.Windows.Controls.ChildWindow', qui est vérifié avant de s'abonner à 'RootVisual_GotFocus'. – apdevelop

Questions connexes