Unter welchen Umständen müssen wir GC.Collect zweimal aufrufen

Wir haben eine WPF-Anwendung, die auf Unity mit MMVVVM-Muster basiert. Im Anwendungslebenszyklus kann es mehrere Projektlebenszyklen geben. Nach jedem Projektlebenszyklus führen wir einen manuellen Abriss durch und versuchen, alle Referenzen von ViewModels freizugeben. Für Event-Abonnements mit Unity verwenden wir schwache Referenzen. Wir gehen also davon aus, dass wir nach dem Abreißen GC Collect aufrufen können, damit alle Müllobjekte Müll sind. Wir haben eine weitere Möglichkeit, das Abonnement für alle Ereignisse manuell aufzuheben. Wir bevorzugen jedoch die Garbage Collection, da hierdurch etwa 200 MB gelöscht werden, was das Laden neuer Projekte erleichtert.

ei einer Instanz stellen wir fest, dass, wenn ich GC.Collect nur einmal aufrufe, die Referenz noch einige Zeit im Speicher verbleib

GC.Collect();
GC.WaitForPendingFinalizers(); 

Aber wenn ich versuche, GC zweimal hintereinander aufzurufen, wird alles schön aufgeräumt.

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();

Alle Gedanken oder Hinweise werden sehr geschätzt.

Aktualisieren

In der Klasse sind keine Finalizer definiert.

Jetzt überlege ich mir auch einen Fall, in dem dieses Objekt in einem anderen Objekt referenziert wird, das einen Finalizer haben könnte. In unserem Framework gibt es Finalizer nur für DBProvider, also glaube ich nicht, auch das ist der Fall.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage