2013-07-15 16 views
8

Ich plante die Erstellung eines WPF MVVM-Geschäftsanwendungsframeworks, und ich stieß auf viele Artikel, als ich über Speicherverluste in der WPF-Plattform recherchierte.Speicherverluste, die immer noch in WPF 4 vorhanden sind

A memory leak may occur when you use data binding in Windows Presentation Foundation
Avoiding a WPF memory leak with DataBinding (Black Magic)
Serious Memory Leaks Plague WPF
Top 5 Memory leaks in WPF and Silverlight
WPF Binding Bug leads to possible Memory Issues

Aber die meisten von ihnen stammen aus 2007 und 2008, so war ich frage mich, wer von ihnen gelöst ist und welche nicht.

Mit anderen Worten, was sind die möglichen Quellen von Speicherlecks (die passieren könnten), um beim Erstellen meines Frameworks zu berücksichtigen oder allgemein zu beobachten (WPF 4.0, .NET 4.0)?

Edit: Ich werde versuchen, genauer zu sein. Kann ich die WeakEventManager und ihre Unterklassen nutzen, um auf Ereignisse zu warten, ohne meine eigene Lösung entwickeln zu müssen?

Bearbeiten 2: Noch spezifischer. Kann ich das WeakEventManager verwenden, um das Problem von Speicherverlust zu lösen, der von Ereignissen in .NET allgemein und nicht nur von WPF verursacht wird? Wenn ja, warum gehört es zu einem WPF-Namespace und nicht zu einem allgemeinen .NET-Namespace?

+4

Können Sie bitte einige spezifische Links hinzufügen? Missverständnisse über Ereignisreferenzen waren eine häufige Quelle für fehlerhafte "Speicherleck" -Meldungen - suchen Sie nach WeakEvent als Ausgangspunkt. – Govert

+0

@Govert Ich habe einige Links hinzugefügt. –

+0

Ich frage mich nur, warum jemand abstimmen könnte, um diese Frage zu schließen, welche Bedingung verletzt es oder was ist generell falsch? !! –

Antwort

8

Erste, die mir in den Sinn kommt:

  • System.Windows.Interactivity.Behavior von System.Windows.Interactivity.dll: ein Verhalten möglicherweise nicht lösen, wenn Sie es und umgekehrt erwarten, hinzugefügt Veranstaltung verlassen Handler auf der Steuer gc
  • Nur durch Ihre Beschreibung Ich bin ziemlich sicher, du wirst Drittkomponenten in Zukunft verwenden, um zu überleben, fanden wir dies auf Lecks ein erstklassiger Kandidat sein

Die Tatsache, dass Sie vor dem Start darüber nachdenken, ist ap Lus, investieren Sie in einen guten MemoryProfiler und profilieren Sie Ihre App regelmäßig von Anfang an und Sie werden es schaffen.

Edit: Um kommentieren Sie Ihre Änderungen: Überprüfung durch Ihre Links glaube ich Ihnen drei Themen isolieren können:

  • implementieren INotifyPropertyChanged ist ein Muss. Ihr erster Entwickler, der Ihnen sagt "es ist nur eine statische Ansicht, Daten werden sich nicht an meinem Modell ändern, ich habe nur INPC übersprungen" muss in der Öffentlichkeit gezeichnet und geviertelt werden. Noch besser, Ihr Framework sollte die Implementierung dieser Schnittstelle erzwingen oder es zumindest für Entwickler so einfach wie möglich machen, sie zu benutzen.
  • Nicht an PropertyDescriptors binden, was nicht an erster Stelle offensichtlich ist, aber Ihr Framework könnte einen Pfad für Entwickler festlegen, die es nur verwenden, um an benutzerdefinierte Viewmodel-Eigenschaften zu binden.
  • deregistrieren immer dein Eventhandler, die meiner Meinung nach Hygiene mehr eine Frage der Code

Was deine Bearbeitung über schwache Ereignisse ist, ja dies funktionieren könnte. Persönlich würde ich diese gute Praxis nicht in Betracht ziehen, da dies zu Situationen führen könnte, in denen Ihr Modell, das die Ereignisse anzeigt, zu denen Sie sich anmelden, früher als erwartet bereinigt wird. Ich würde vorschlagen, die Extrameile zu gehen und deinen Handler bewusst aufzuheben.

+0

+1 für den Einblick der dritten Partei. Wenn Sie Zeit haben, wäre ich dankbar, wenn Sie Ihre Antwort mit WIE Sie isoliert und entdeckt mls in diesen Komponenten konkretisiert. Ich vermute, es ist ein Problem von vielen Menschen –

+0

+1 für das Verhalten Leck * (ein weiteres Leck ich wusste nicht aus) *. Ich werde Ihre Vorschläge prüfen, aber können Sie bitte Ihre Antwort noch einmal überdenken, da ich einige Änderungen an meiner ursprünglichen Frage vorgenommen habe? Vielen Dank. –

+0

Re: Verhaltensweisen ... Ich folgte [diese Anleitung] (http://dotnetbyexample.blogspot.com/2011/04/safe-event-detachment-pattern-for.html), um sicher aus dem AssociatedObject – Thelonias

Verwandte Themen