Ich habe ein Testprogramm geschrieben, in dem ein einzelnes Button
in XAML als Inhalt eines Window
definiert ist. Nach dem Laden des Fensters wird Button
programmatisch als Inhalt des Fensters ersetzt, und das darauf bezogene Feld wird ebenfalls ersetzt, sowohl durch ein anderes Button
, das ich programmgesteuert erstellt habe. Ich verfolge dann beide Objekte Button
mit schwachen Referenzen und poll in Intervallen von 1/10 Sekunde die IsAlive
-Eigenschaft von jedem. Vor der ersten Überprüfung von IsAlive
im ersten Aufruf der Polling-Methode lösche ich auch Verwurzelungsverweise auf das programmatisch definierte Button
.
Die Erwartung bei der Ausführung dieses Codes würde darin bestehen, dass beide Button
-Objekte trotz Nichtdeterminismus beim Timing der C # -Abfallsammlung als Garbage Collected gemeldet würden. Obwohl das programmgesteuerte Button
dieses Verhalten normalerweise innerhalb einer 1/2 Minute zeigt, wird das XAML Button
nie gesammelt. Ich habe das Programm länger als zehn Minuten laufen gelassen, als ich dieses Verhalten sah.
Kann mir jemand sagen, warum das XAML Button
Objekt nicht gesammelt wird? Insbesondere würde ich gerne wissen, wo die Garbage-Collection-Blockierungsreferenz ist , ob es in meinem Code oder in der WPF-Implementierung ist. Vielleicht liegt es in einem XAML-Ladeobjekt. Betrachte ich eine Art Speicherleck?
Das oben beschriebene Programm ist unten als Referenz enthalten.
MainWindow.xaml:
%Vor%MainWindow.xaml.cs:
%Vor%App.xaml:
%Vor%Tags und Links wpf memory-leaks c# garbage-collection xaml