Ich bin neugierig auf die Lebensdauer der ObservableForProperty-Lebensdauer, wenn ich das Dispose auf dem Observer nicht explizit anrufe. Es ist mir in diesem Szenario nicht wirklich wichtig, Abonnements zu lange zu erhalten usw.
Wenn Sie im herkömmlichen .NET Ereignisse haben, die Sie nicht abbestellen, kann dies möglicherweise zu Speicherverlusten führen, da die Lebensdauer Ihres Objekts an das Ereignis gebunden ist. zB wie in Ссылка vorgeschlagen:
Ereignisse können auch starke Wurzelreferenzen sein und als solche zum starken Referenzpfad beitragen und somit die Lebensdauer eines Objekts beeinflussen. Gewöhnliche Ereignisse in der Common Language Runtime (CLR) 2.0 sind bidirektionale starke Referenzen zwischen der Ereignisquelle und dem Listener und können daher ein Objekt (entweder Quelle oder Listener) am Leben erhalten, das ansonsten bereits tot sein sollte.
Beim Durchsehen der ReactiveUI-Codebasis bei einem INotifyPropertyChanged-Objekt stelle ich fest, dass Sie FromEventPattern beim Abonnieren des INotifyPropertyChange-Ereignisses verwenden.
Führt die Verwendung von ObservableForProperty zu diesem Problem, das Objekt länger am Leben zu halten, indem der starke Referenzpfad erstellt wird?
Danke, Glenn
Sie haben Recht, wenn Sie WhenAny / ObservableForProperty falsch verwenden, kann Ihre Anwendung Speicher verlieren, wenn Sie nicht vorsichtig sind. Betrachten Sie den folgenden Code:
%Vor%Weil wir WhenAny durch ein Objekt, dessen Lebensdauer länger ist als unser (dh das ListBox-Objekt im Vergleich zum Fenster), halten wir ListBox-Objekte für immer bis das Fenster verschwindet (was vielleicht nie in deiner App ist).
Sie werden die große Mehrheit dieser Fälle vermeiden, wenn Sie nur WhenAny auf Ihrem eigenen Objekt (d. h. immer this.WhenAny
, niemals someObject.WhenAny
).
Ganz gleich, was Sie haben , um alle WhenAny zu entfernen, die eine DependencyProperty durchlaufen, oder Sie lecken. Weil Windows.
Es wurde eine neue Funktion zu ReactiveUI hinzugefügt, um das Szenario zu behandeln, in dem Sie dies tun möchten, genannt "Aktivierung". Sie finden weitere Informationen unter:
Wir können jetzt einen Bereich von "Sachen, die nur auf dem Bildschirm aktiv sein sollten" definieren, die sofort verschwinden, nachdem eine Ansicht und ihr ViewModel vom Bildschirm entfernt wurden (dh aus dem Visual Tree in WPF entfernt wurden) / p> %Vor%
Damit dies funktioniert, müssen wir Folgendes beachten:
ISupportsActivation
(super easy) implementieren WhenActivated
aufrufen. Es sieht so aus, aber es ist absolut nicht. Erinnere dich nur an zwei Dinge:
Tags und Links .net c# garbage-collection system.reactive reactiveui