Steuerelement löschen ohne Arraylist

winnitou

Grünschnabel
Hallo,

habe das Problem, das ich mehrere Controls loeschen moechte die ich durch add hinzugefuegt habe,
habe dabei kein Array benutzt, wie es in einem vorherigen Beitrag schon einmal angesprochen wurde.

button_new = new Button();
Controls.Add (this.button_new);


Durch Controls.Clear(); lösche ich zwar die Controls, sie werden aber nicht aus dem GC geloescht,
somit habe ich einen ungewollt hohen Speicherverbrauch.

Kann ich die Controls auch ohne Array einfach komplett löschen?!

Mit

this.Controls.Remove(this.button_new);

kann ich ja immer nur den letzten Button loeschen aber nicht alle vorherig erzeugten Buttons.

danke.
 
Hallo!

Wenn der Speicher knapp wird, dann löscht die Garbage Collection die bereits freigegebenen Controls automatisch, darum musst Du Dich nicht kümmern. Entferne sie einfach und den Rest erledigt .NET für Dich.
 
Habe ich auch gedacht aber leider erledigt das die GC nicht.

Wenn ich die Controls mit

Controls.Clear();

oder

Controls.Remove(button_new);


loesche und den GC mit

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

anstosse bleibt der speicher trotzdem belegt?!
 
Spätestens dann sollte man sich die Dokumentation zum Garbage Collector mal durchlesen ...

... denn dieser läuft in unregelmäßigen Abständen automatisch. Du kannst zwar markieren, dass er zu laufen hat, aber du kannst nicht steuern wann er zu laufen hat. Sprich ein GC.Collect() bringt eigentlich herzlich wenig.

Nach dem Controls.Clear() musst ein wenig warten. Oft wird der Speicher auch erst entleert wenn anderweitig Speicher benötigt wird.
 
Hatte dieses auch gemacht, habe mich dabei auf ein Buch verlassen.
In diesem wird beschrieben, das man diesen so manuell ausloesen kann.

Das Programm laeuft auf einem SmartDevice, deshalb ist der Speicher auch recht begrenzt.

Auch nach laengerem warten und ausfuehren von anderen Befehlen
gibt er den Speicherbereich einfach nicht frei.
Muss mal testen ob dieses nur fuer Buttons gilt oder auch bei anderen Controlls so ist.
 
Ähm, was hat der Speicherplatz auf dem SmartDevice mit Deinem Arbeitsspeicher zu tun?

Ich gehe mal davon aus, dass Du sowas wie einen Memorystick zum Speichern des Programms verwendest. Das Programm wird aber nach dem Start in den Arbeitsspeicher des ausführenden Rechners geladen. Wenn Du dort z.B. 1024 MB RAM vorrätig hast, davon sagen wir mal 800 MB frei sind, dann hat Dein Programm aber noch eine Menge Speicher zur Verfügung bis die GC reagieren muss. Wenn Du mehr als die 800 MB zuschüttest und wieder frei gibst, dann wird die GC irgendwann reagieren und dann alte Zeugs löschen.
 
Das Programm wird auf einem SmartDevice ausgefuehrt und der
Arbeitsspeicher eines Smartdevice ist recht begrenzt.

Dieser wird dann auch von dem ausfuehrenden Programm
auf dem SmartDevice genutzt.
Der ausfuehrende Rechner ist somit das SmartDevice.

Dabei ist nicht der Speicher fuer das Programm an sich problematisch sondern
der Mem Usage.
Und dieser wird nie weniger sondern erhoeht sich laufend.
 
Achso, Du meinst sowas wie einen PDA ... nun gut, darin bin ich weniger bewandet, deswegen meine Falschaussage ... sorry ...

Trotzdem sollte es mit VS2003.NET und dem .NET-Framework 1.1 kein Problem sein das zu lösen. Das Ding hat ja eine spezielle Windows CE Unterstützung verpasst bekommen. Sollte auch genauso funktionieren wie auf einem normalen PC. Die GC gibt den Speicher wieder frei sobald dies nötig ist.
 
Zurück