Hallo,
in meinem Twitch Viewer Display ich habe eine ListView für den Chat. Das ListViewItem ist ein UserControl (ChatRow.xaml.cs (Github)). Eine ObservableCollection mit dem Datenmodell für das UserControl ist an die ListView gebunden. So weit schön und gut.
Wenn sich die Liste füllt, werden innerhalb jedes ChatRow-Controls dynamisch weitere UIElemente erzeugt - TextBlocks für den Text, Images für die Emoticons. Auch wenn ich weiß, dass UIElemente im Codebehind erstellen nicht guter WPF-Stil ist, wüsste ich nicht wie ich das anders machen soll. Ist prinzipiell aber egal, performancetechnisch läuft das ganze 1A - da bin ich echt beeindruckt, was die Hardwarebeschleunigung da bringt.
Leider zieht das aber auch nicht unwesentlich Arbeitsspeicher. Meine Idee war es, die ObservableCollection von Zeit zu Zeit zu Clearen, um wieder Speicher freizugeben. Allerdings wird zwar die ObservableCollection gecleared und in der ListView ist dann auch gähnende Leere - jedoch verbleiben offensichtlich alle ChatRow-Controls im Arbeitsspeicher, auch wenn sie nicht mehr angezeigt werden und werden vom GC auch nicht gelöscht. Ja, ich habe testweise das IDisposable-Pattern implementiert und darin auch alle Children des Stackpanels im ChatRow-Control entfernt (Dispose implementieren diese ja nicht) und nein, leider verbleiben die ChatRows im Arbeitsspeicher.
Meine Frage nun: Was referenziert noch auf die ChatRow-Objekte, dass diese vom GC nicht einkassiert werden? Die ChatRows werden ja vom Framwork erstellt. Könnte dieser Teil im ChatRow-Control etwas ausmachen:
in meinem Twitch Viewer Display ich habe eine ListView für den Chat. Das ListViewItem ist ein UserControl (ChatRow.xaml.cs (Github)). Eine ObservableCollection mit dem Datenmodell für das UserControl ist an die ListView gebunden. So weit schön und gut.
Wenn sich die Liste füllt, werden innerhalb jedes ChatRow-Controls dynamisch weitere UIElemente erzeugt - TextBlocks für den Text, Images für die Emoticons. Auch wenn ich weiß, dass UIElemente im Codebehind erstellen nicht guter WPF-Stil ist, wüsste ich nicht wie ich das anders machen soll. Ist prinzipiell aber egal, performancetechnisch läuft das ganze 1A - da bin ich echt beeindruckt, was die Hardwarebeschleunigung da bringt.
Leider zieht das aber auch nicht unwesentlich Arbeitsspeicher. Meine Idee war es, die ObservableCollection von Zeit zu Zeit zu Clearen, um wieder Speicher freizugeben. Allerdings wird zwar die ObservableCollection gecleared und in der ListView ist dann auch gähnende Leere - jedoch verbleiben offensichtlich alle ChatRow-Controls im Arbeitsspeicher, auch wenn sie nicht mehr angezeigt werden und werden vom GC auch nicht gelöscht. Ja, ich habe testweise das IDisposable-Pattern implementiert und darin auch alle Children des Stackpanels im ChatRow-Control entfernt (Dispose implementieren diese ja nicht) und nein, leider verbleiben die ChatRows im Arbeitsspeicher.
Meine Frage nun: Was referenziert noch auf die ChatRow-Objekte, dass diese vom GC nicht einkassiert werden? Die ChatRows werden ja vom Framwork erstellt. Könnte dieser Teil im ChatRow-Control etwas ausmachen:
Twitch Viewer Display Chat-, Zuschauer- und Statistiktool für Streamer