Laden...

Variable in WPF-Window bleibt nach schließen und null-setzen von Fenster bestehen

Erstellt von m.grauber vor 2 Jahren Letzter Beitrag vor 2 Jahren 335 Views
M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 2 Jahren
Variable in WPF-Window bleibt nach schließen und null-setzen von Fenster bestehen

Hallo!

In einem C# WPF-Projekt wird in "Window1 (Hauptfenster)" das "Window2" geöffnet und darin "Window3". (Jeweils mit einer lokalen Var und .Show())


public partial class Window3 : Window
{
         private bool bLF = false;
         ...
}

Im Window3 wird am Ende von Loaded() bLF auf true gesetzt.
Später wird Window3 geschlossen und danach von außerhalb(!) dieser Fenster Window3=null gesetzt und danach Window2 ebenfalls geschlossen und Window2=null gesetzt und danach jeweils GC.Collect() sowie GC.WaitForPendingFinalizers() ausgeführt. (Ja ich habe hier oft gelesen, GC ist nicht notwendig).

Öffnet man nun wieder Window2 und dann Window3 jeweils normal mit .Show(), ist in Window3 bLF immer noch auf true gesetzt, obwohl das Fenster Window3=null gesetzt war!

So etwas habe ich bislang noch nie gesehen. Scheint eine hängende Referenz zu sein?

Ich habe nun versucht zu sehen, wo genau bLF auf true umgestellt wird:


internal Window3()
{
            MessageBox.Show("Zeile1 bLF=" + (bLF == true ? "true" : "false"));
            InitializeComponent();
            MessageBox.Show("Zeile 2 bLF=" + (bLF == true ? "true" : "false"));
            bLoadedFinished = false;
            MessageBox.Show("Zeile 3 bLF=" + (bLF== true ? "true" : "false"));
}

Beim erneuten Öffnen ist bLF in Zeile 1 false (so wie es sein soll) und dann aber nach InitializeComponent() seltsamerweise auf true, obwohl es erst am Ende von Loaded auf true gesetzt wird! bLF wird sonst wirklich nirgendwo auf true gesetzt.

Wenn man zum Test bLF vor dem Schließen des Window3 auf false setzt, ist es dann nach dem Erneuten Öffnen von Window3 korrekt auf false! Es behält also seinen alten Wert, obwohl das Fenster mit .Close() und window3=null geschlossen wurde und der GarbageCollection bereinigt wurde. Das erneute Öffnen erfolgt ca. 1 Min. danach, wodurch eigentlich die GC genügend Zeit hätte den Speicher zu bereinigen.

Im Windows-Task-Manager geht die Speicherauslastung beim Schließen des Window3 schon etwas herunter, aber nie auf die Werte vor dem Öffnen des Fensters Window3. Ja, ihr schreibt, der Taskmanager ist ungenau.

Die einzige Referenz die auf Window3 besteht ist eine ObservableCollection außerhalb der Fenster mit einer Klasse die ein Feld "public Window Window { get; set; }" besitzt und der das Fenster zugewiesen wird, wenn es geöffnet ist. Allerdings wird dieses Feld dann beim Schließen auch auf null gesetzt und danach das komplette Item mit .Remove(item) entfernt.

Was läuft da falsch?

Vielen Dank!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

J
251 Beiträge seit 2012
vor 2 Jahren

Könntest das Feld zu einer Eigenschaft umwandeln und via Debugger im Setter den Pfad folgen, woher das "True" kommt.

Aber an Hand des gelieferten Codes ist es nicht ersichtlicht, was genau passiert.

Evtl. hilft auch [Tutorial] Vertrackte Fehler durch Vergleich von echtem Projekt mit minimalem Testprojekt finden

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 2 Jahren

Hallo Jamikus!

Danke für die wirklich clevere Idee! - Ja ich habe die Position gefunden.

Im Loaded wird bLF immer mit false angezeigt, aber im Loaded werden auch einige Radiobox_Checked() aufgerufen und sobald der Debugger da im Einzelschritt hineinspringt, wird darin teilweise bLF=true angezeigt! Nach dem Herausspringen aus der Radiobox_Checked() ist aber bLF im Loaded wieder korrekterweise false!

Im Loaded ändert es sich also nicht, aber in den Untermethoden ist der Wert bLF teilweise(!) falsch.

(Nein ich habe keine lokale Variable in den Untermethoden, die auch bLF heißt. Wenn ich in der Untermethode in der Abfrage if (bLF==true) den Cursor auf bLF platziere und dann F12 drücke, komme ich genau zu meiner definierten bLF - Variable aus dem Window.

Ich bin total ratlos.

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

16.806 Beiträge seit 2008
vor 2 Jahren

Bei WPF ist es ratsam mit dem MVVM Pattern zu arbeiten, sonst wirst Du immer in solche Event Probleme kommen und von Workaround zu Workaround stolpern.
[Artikel] MVVM und DataBinding

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 2 Jahren

Hallo Abt

Danke! Ja das ist allerdings eine ältere Anwendung die ich übernommen habe und ich darf sie nicht komplett umbauen.

Hier geht es aber nicht um die Datenspeicherung, sondern nur um die Darstellung beim Öffnen des Fensters. So etwas sollte eigentlich nicht passieren.

Vielleicht hat noch jemand eine Idee?

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]