myCSharp.de - DIE C# und .NET Community (https://www.mycsharp.de/wbb2/index.php)
- Entwicklung (https://www.mycsharp.de/wbb2/board.php?boardid=3)
-- GUI: WPF und XAML (https://www.mycsharp.de/wbb2/board.php?boardid=85)
--- Steigender Speicherverbrauch bei Seitenwechsel - Frame, Pages (https://www.mycsharp.de/wbb2/thread.php?threadid=122521)


Geschrieben von echdeneth am 06.01.2020 um 14:40:
  Steigender Speicherverbrauch bei Seitenwechsel - Frame, Pages
Ich verwende die NuGet-Pakete von MaterialDesign.

Bei meinem Projekt habe ich ein Hauptfenster in dem im Wesentlichen nur das Frame und ein paar Buttons enthalten sind. Über ein Button lässt sich zwischen 2 Pages wechseln.
Nach jedem Wechsel steigt der Speicherverbrauch um ein paar MB, obwohl die Pages und alle Inhalte eigentlich gelöscht sein sollten. (KeepAlive=false)

Ich verstehe nicht warum. Der Projektcode ist auch zu groß um es hier zu posten.

Code für den Aufruf/Wechsel:

C#-Code:
            if ((App.Current as App).MainWindowButtonReLief == "L")
            {
                Storyboard sb1 = FindResource("Dreh1") as Storyboard;
                sb1.Begin();
                if (sb1.GetCurrentState() == ClockState.Stopped)
                {
                    Lbl_ReLie.Content = "Rechnungen";
                    Pi_ReLief.Kind = MaterialDesignThemes.Wpf.PackIconKind.FormatListNumbered;

                    Storyboard sb2 = FindResource("Dreh2") as Storyboard;
                    sb2.Begin();

                    (App.Current as App).MainWindowButtonReLief = "R";
                    Frame.Navigate(new Lieferanten());
                }

Danke


Geschrieben von Abt am 06.01.2020 um 15:39:
 
Warum machst Du das nicht einfach über XAML?

So bist Du selbst in der Verantwortung Objekte zu disposen (was Du nicht tust), damit der Speicher aufgeräumt wird.


Geschrieben von echdeneth am 06.01.2020 um 16:02:
 
Zitat von Abt:
Warum machst Du das nicht einfach über XAML?

Der Aufruf der Seiten? Ich nahm an dies wird im CodeBehind gemacht...
Ich schau mal wie das gemacht wird.

Zitat von Abt:
So bist Du selbst in der Verantwortung Objekte zu disposen (was Du nicht tust), damit der Speicher aufgeräumt wird.

Wie schon gesagt, hatte ich die Info das der Inhalt einer Page gelöscht wird wenn man diese verlässt. Aber wenn ich den Aufruf im CodeBehind mache muss ich alles manuell löschen(disposen?)?

Na lustig...


Geschrieben von MrSparkle am 06.01.2020 um 17:18:
 
Zitat von echdeneth:
Nach jedem Wechsel steigt der Speicherverbrauch um ein paar MB, obwohl die Pages und alle Inhalte eigentlich gelöscht sein sollten.

Gibt es irgendwann eine OutOfMemoryException?

Wie hast du das denn überhaupt gemessen? Mit einem Profiler? Mit dem Taskmanager?

Zitat von echdeneth:
C#-Code:
(App.Current as App).MainWindowButtonReLief = "R";

So sollte man seinen Anwendungsstatus aber nicht steuern. Da gibt es wesentlich bessere Wege. Schau dir mal diesen Artikel an:  [Artikel] MVVM und DataBinding.


Geschrieben von echdeneth am 07.01.2020 um 09:05:
 
Zitat von MrSparkle:
Gibt es irgendwann eine OutOfMemoryException?

Wie hast du das denn überhaupt gemessen? Mit einem Profiler? Mit dem Taskmanager?

In Visual Studio, die Speicheranzeige

Zitat von MrSparkle:
So sollte man seinen Anwendungsstatus aber nicht steuern.

Ich weiss, dass das unsauber ist, hatte zu dem Zeitpunkt kaum eine Wahl, werde mal schauen ob es anders geht.

MVVM wäre mein Ziel und die Mutter aller Lösungen aber ich bekomme aber manche Dinge nicht hin. Wie z.B. einen SQL Query (incl. Pipapo) im ModelView.
Auch steigt der Speicherverbrauch stetig an (Weil ich das MV im CodeBehind aufrufen/instanzieren muss um Daten von MySQL darin zu speichern).
In der Berufsschule wird MVVM leider nicht drangenommen und Tutorials sind leider oft spezifisch, nicht Allgemein und verständlich.


Geschrieben von MrSparkle am 07.01.2020 um 22:01:
 
Zitat von echdeneth:
Ich weiss, dass das unsauber ist, hatte zu dem Zeitpunkt kaum eine Wahl

Man hat immer eine bessere Wahl als "Magic Strings" mit kryptischen Bezeichnern in Eigenschaften mit kryptischen Bezeichnern zu speichern, an die man nicht ohne Casting kommt!

Zitat von echdeneth:
Wie z.B. einen SQL Query (incl. Pipapo) im ModelView.
Auch steigt der Speicherverbrauch stetig an (Weil ich das MV im CodeBehind aufrufen/instanzieren muss um Daten von MySQL darin zu speichern).

Datenbankzugriffe gehören überhaupt nicht in die View. Siehe dazu  [Artikel] Drei-Schichten-Architektur

Zitat von echdeneth:
In der Berufsschule wird MVVM leider nicht drangenommen

Das kannst du auch nicht erwarten ;)

Zitat von echdeneth:
Tutorials sind leider oft spezifisch, nicht Allgemein und verständlich.

Wenn du etwas nicht verstehst, und trotzdem etwas lernen willst, kannst du gerne hier fragen. Dazu ist das Forum ja da :)


Geschrieben von echdeneth am 08.01.2020 um 11:19:
 
Zitat von MrSparkle:
Datenbankzugriffe gehören überhaupt nicht in die View.

Ja, ich habe mich mißverständlich ausgedrückt. Ich meinte das ViewModel.

Auch wenn (je nach dem welches Tutorial) die einen sagen in etwa: "Logic und Datenbankzugriffe und Zeuchs gehören in das Model"
und die anderen: "... gehören in das ViewModel, ist doch Sonnenklar!" - janee, is nich klar...

Ist wohl wie die alte Frage: Beatles oder Rolling Stones?


Geschrieben von Abt am 08.01.2020 um 12:36:
 
MVVM ist ein sehr reifes Konzept, was die Architektur der Benutzeroberfläche behandelt.

MVVM ist aber kein Gesamtarchitekturkonzept einer Anwendung und gibt keine Regel vor, wo die Datenkommunikation erfolgt.
Das ist nicht Aufgabe von MVVM.

Prinzipiell ist alles, was Teil von MVVM ist, nur "UI" - alles.
Logik im Sinne von "Anwendungslogik" kann nicht Teil von MVVM sein, weil es dann in der UI liegen würde.
Siehe  [Artikel] Drei-Schichten-Architektur
Mit MVVM greift man in solch einer Schicht-Architektur auch nur auf die anderen beiden (man kann auch mehr haben) Schichten zu.

Eine Software besteht i.d.R. aus mehreren Architektur-Pattern/Konzepten.
Auch der Vergleich ist unpassend, da es eben nicht nur zwei Wege gibt.

Wenn Du es sehr sehr sehr modern haben willst, dann verwendest Du MVVM zusammen mit Reactive Extensions.
 ReactiveUI - The Zen of The ViewModel
Wenn Du aber das Grundkonzept von MVVM (Was ist es - und was ist es nicht?) noch nicht verinnerlicht hast, dann mag das mit ReactiveUI evtl etwas zuviel aktuell sein.


Geschrieben von MrSparkle am 08.01.2020 um 18:42:
 
Zitat von echdeneth:
Ja, ich habe mich mißverständlich ausgedrückt. Ich meinte das ViewModel.

Das ViewModel ist doch Teil der View (bzw. UI oder Präsentationsschicht).

Datenbankzugriffe gehören in die Datenzugriffsschicht (DAL), wie der Name schon sagt, und weder in die Präsentationsschicht, noch in die Businesslogik.

Zitat von echdeneth:
gehören in das ViewModel, ist doch Sonnenklar!

Sagt wer?


Geschrieben von echdeneth am 09.01.2020 um 09:21:
 
Zitat von MrSparkle:
Sagt wer?

Wie gesagt, je nach dem welches Tutorial man besucht. Ich beziehe mich bei MVVM auf Tutorial- und (YouTube)Video-Wissen und auf Beiträge in solchen Foren.

In jenen Tut's ist auch keine Rede von Präsentationschichten und dergleichen und was wo rein gehört.

Diese (die meisten...?) Informatiker sind leider oft mit einer Art Betriebsblindheit geschlagen und gehen in Erläuterungen von IHREM EIGENEN Kenntnisstand aus und implizieren diesen beim Lehrsuchenden.


Geschrieben von Coffeebean am 09.01.2020 um 12:38:
 
Hallo echdeneth,

so ein Tutorial kann sicher gut sein, aber bitte versuche nicht _alles_ mit MVVM zu erschlagen.

Zitat:
MVVM ist ein sehr reifes Konzept, was die Architektur der Benutzeroberfläche behandelt.

MVVM spielt sich sehr nah an der Oberfläche ab, es ist ein Konzept für die Oberfläche. Zu einer App gehört u.U. aber noch sehr viel mehr, wie etwa Datenzugriff. Der hat aber erstmal wenig mit MVVM zu tun. Der gehört in eine andere Schicht. MVVM ist ein Pattern von eventuell recht vielen innerhalb einer Applikation.

Aber wir schweifen vom Thema ab :) Lies dich in MVVM ein, die Links sind da, dann kannst du mit sauberem Erstellen und Abräumen von Controls deinen Speicherverbauch in den Griff bekommen.

Gruss

Coffeebean


Geschrieben von Abt am 09.01.2020 um 14:24:
 


Zitat von echdeneth:
Diese (die meisten...?) Informatiker sind leider oft mit einer Art Betriebsblindheit geschlagen und gehen in Erläuterungen von IHREM EIGENEN Kenntnisstand aus und implizieren diesen beim Lehrsuchenden.

Sorry, aber die Aussage ist nicht fair.

Davon abgesehen, dass man immer nur vom eigenen Kenntnisstand ausgehen kann - ich kann schließlich schlecht was sagen, was ich nicht kenne - basieren die meisten Tutorials einfach auch aus Erfahrung.
Ja, der Wald von Tutorials hat ziemlich viele Bäume - aber das ist auch gut so.


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 01.06.2020 15:29