ReactiveUI ObservableForProperty Lebenszeit

8

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

    
Glenn Watson 12.03.2014, 02:00
quelle

1 Antwort

18

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 ).

Ein spezieller Hinweis zu Abhängigkeitseigenschaften

Ganz gleich, was Sie haben , um alle WhenAny zu entfernen, die eine DependencyProperty durchlaufen, oder Sie lecken. Weil Windows.

Mist, was mache ich jetzt?

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:

  1. Ihr VieWModel muss ISupportsActivation (super easy) implementieren
  2. Die View, die mit Ihrem ViewModel verknüpft ist, muss auch WhenActivated aufrufen.

Das hört sich super an!

Es sieht so aus, aber es ist absolut nicht. Erinnere dich nur an zwei Dinge:

  1. Nicht WhenAny durch Objekte, die für immer haften bleiben, es sei denn, Sie auch bleiben für immer
  2. Wenn es nötig ist, verwenden Sie WhenActivated.
Paul Betts 12.03.2014, 03:19
quelle