2011-01-15 5 views
0

Ich habe den folgenden Code in einer Windows Phone 7 Silverlight App von mir, die vor der Navigation zu einer anderen Seite ausgeführt wird.Wie werden Delegaten richtig verwendet? (mit WPF Storyboards als Beispiel)

Storyboard storyboard = Resources["TurnstileBackwardOut"] as Storyboard; 
Storyboard.SetTarget(storyboard, LayoutRoot); 
storyboard.Completed += delegate 
    { 
     storyboard.Stop(); 
     Debug.WriteLine("LeavePageStoryboard.Completed"); 
     NavigationService.Navigate(uri); 
    }; 
storyboard.Begin(); 

Das Storyboard ist in den Ressourcen und wird sehr oft wiederverwendet werden. Wie ich es verstehe, wird bei jedem Ausführen des Codes ein neuer Delegat zum Completed-Ereignis hinzugefügt. Meine Frage ist: Muss ich diesen Delegaten aus dem Completed Event entfernen?

Sonst würde es nach einiger Zeit viele Delegaten geben und einige von ihnen würden nicht einmal zur aktuellen Seite gehören, da ich das Storyboard auch auf anderen Seiten verwende.

Antwort

3

Sie sollten in der Lage sein zu sagen, ob dies ein Problem ist, denn wenn Sie navigieren, werden Sie viele Kopien von "LeavePageStoryboard.Completed" sehen. Wenn es nicht jedes Mal ein neues Storyboard erstellt, vermute ich, dass es ein Problem ist. Es ist jedoch leicht zu beheben:

2

Dies ist ein Speicherverlust und eine gemeinsame in C#. Wenn Sie ein langlebiges Objekt haben, das häufig wiederverwendet wird, häufen sich Ereignishandler häufig daran.

Es gibt ein paar Optionen:

1) Stellen Sie Ihre Stellvertretung nicht anonym sein. Erstellen Sie eine Methode, um ihre Logik beizubehalten, und verwiesen Sie auf Delegaten. Entfernen Sie dann diesen referenzierten Delegaten, wenn Sie mit dem Storyboard fertig sind.

2) Machen Sie Storyboard nicht lange gelebt. Eine Möglichkeit besteht darin, stattdessen eine DataTemplate zu erstellen und neue Kopien davon zu erstellen. Dann können Sie Event-Handler anhängen, alles, was Sie wollen und einmal Müll gesammelt, werden sie auch Müll gesammelt.

Verwandte Themen