XAML-Schaltfläche, die nach dem Eliminieren von Verweisen nicht gelöscht wurde

8

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%     
80386 DX 15.11.2011, 19:35
quelle

1 Antwort

2

Die Schaltfläche wird nicht erfasst, da im Namescope Window stark darauf verwiesen wird:

Aber es sollte nicht als Speicherleck erkannt werden, da Sie Ihre neue Schaltfläche im Bereich erneut registrieren sollten:

%Vor%     
DmitryG 16.11.2011, 08:48
quelle