Wir haben eine WPF-Anwendung, basierend auf Unity mit MMVVVM Muster. Im Anwendungslebenszyklus kann es mehrere Projektlebenszyklen geben, nach jedem Projektlebenszyklus führen wir einen manuellen Abbau durch und versuchen, alle Referenzen von ViewModels freizugeben. Für Ereignisabonnements mit Unity verwenden wir schwache Referenzen. Wir gehen also davon aus, dass wir nach dem Abbau GC Collect aufrufen können, so dass alle Müllobjekte Müll gesammelt werden. Wir haben eine andere Möglichkeit, alle Ereignisse manuell abzubestellen, aber wir bevorzugen die Garbage-Collection, da sie für uns ca. 200 MB entfernt, was das Laden neuer Projekte erleichtert.Unter welchen Umständen müssen wir GC.Collect zweimal anrufen
Mit einer Instanz beobachten wir, dass, wenn ich GC.Collect nur einmal aufrufen, seine Referenz noch für einige Zeit im Speicher verbleibt.
Aber wenn ich versuche, GC zweimal in Folge aufzurufen, räumt es alles schön auf.
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
Alle Gedanken oder Hinweise werden sehr geschätzt.
Update:
Es sind keine Finalizer der Klasse definiert.
Jetzt betrachte ich auch einen Fall, in dem dieses Objekt in einem anderen Objekt verwiesen wird, das einen Finalizer haben könnte. In unserem Framework haben wir Finalizer nur für DBProvider, also denke ich nicht, auch das ist der Fall.
Was ist MMVVVM? Die römische Art zu codieren? – DanDan
MVVM ist in WPF üblich, aber in unserem Fall haben wir verschiedene Anwendungen in verschiedenen .NET-Technologien und sie alle basieren auf dem üblichen DomainObject-Framework. Daher entschieden wir uns für eine neue Layer MV über unsere DomainObjects, um unsere WPF-Anwendungen zu vereinfachen. –
MMVVVM = 2985, denke ich. –