2016-12-23 4 views
-2

Relativ einfaches Problem.Wie kann man ein Steuerelement aus dem Speicher in VB.Net entfernen?

Ich habe ein Panel mit einigen Textfeldern darauf, alle dynamisch erstellt. Der Benutzer füllt einige der Textfelder aus und schließt dann das Fenster.

Jetzt im Code verwende ich die Linie;

Me.Pnl_Main.Controls.Clear() 

und das funktioniert gut, die Panel-Inhalte sind "entfernt".

Das Problem besteht darin, dass wenn die Textfelder für den gleichen Zweck neu erstellt werden, sie immer noch die Werte enthalten, die sie zuvor hatten.

Und leider für mich, die meisten der Benutzeroberfläche ist so erstellt, was zwangsläufig zu einem Speicherverlust führt.

Also meine Frage ist, gibt es eine ordnungsgemäße Möglichkeit, eine Steuerung vollständig aus dem Speicher zu entfernen? Oder muss ich eine Routine ausführen, um alle Textwerte auf Nothing zu setzen?

Vielen Dank im Voraus.

+0

Ich denke, das Problem besteht darin, dass Verweise auf die Textfelder, die Sie erstellt haben, immer noch irgendwo vorhanden ist, nachdem Sie '.Clear()' ausgeführt haben. Ich glaube nicht, dass Sie ein Speicherverlustproblem haben, weil Sie immer die gleichen Instanzen von Textfeldern verwenden (deshalb sehen Sie den vorherigen Text). Natürlich werden Textkästen außerhalb des Formulars referenziert, dann ist ein Lecken möglich. Können Sie einen Code zeigen, wie Sie Textfelder erstellen und dem Panel hinzufügen? – Fabio

+0

Nach 'Me.Pnl_Main.Controls.Clear()' können Sie die Textbox Variable auf nichts setzen. –

+0

Die Textfelder sind eigentlich Teil eines Benutzersteuerelements, das ich gemacht habe (auf diese Weise spare ich Zeit beim dynamischen Erstellen großer Mengen von Steuerelementen). –

Antwort

-1

Solange ein Teil Ihres Codes einen Verweis auf Ihre Steuerelemente enthält, werden sie nicht aus dem Speicher gelöscht. Sie müssen alle Verweise auf diese Steuerelemente entfernen, z.

Me.Pnl_Main.Controls = Nothing 

sofern diese Kontrollen sind nicht referenziert überall sonst können sie aus dem Speicher entfernt werden, aber Sie nicht wirklich steuern, wenn sie schließlich aus dem Speicher entfernt werden. Dies geschieht durch den Garbage Collector, der automatisch ausgeführt wird, wenn der Speicher voll wird.

+0

Das tut buchstäblich nichts. Es macht keinen Sinn, Dinge in VB.NET auf 'Nothing' zu setzen. Der Code in der ursprünglichen Frage war korrekt, Bob sollte 'Clear' aufrufen. Der Teil, den er vermisst, ist, dass er jedes Steuerelement in der Sammlung zuerst durchlaufen muss und seine "Dispose" -Mitgliedfunktion aufrufen muss. Sobald dies erledigt ist, kann er 'Clear' aufrufen, um die Sammlung zu leeren. –

+0

Siehe diese Frage, und die Links verbindet: http://stackoverflow.com/questions/1969705/clear-controls-does-not-dispose-them-what-is-the-risk –

-1

Das Disponieren eines Objekts hat nichts speziell mit dem Speicher zu tun. Ein entsorgtes Objekt kann früher aus dem Speicher entfernt werden, aber .NET wird den Speicher wiederherstellen, wenn es gut und bereit ist. Das Zuweisen von neuem Speicher ist viel billiger als das Neuzuweisen vorhandenen Speichers, also wird das meiste die meiste Zeit erledigt.

+0

Das ist irgendwie wahr, irgendwie nicht.Aufruf von Dispose hat nichts mit dem Garbage Collector zu tun; Es gibt * unmanaged * Speicher frei, während der Garbage Collector verwalteten Speicher verarbeitet. Daher ist das Aufrufen von Dispose * kritisch, um ein Speicherleck zu vermeiden. Wenn ein Typ IDisposable implementiert, müssen Sie * seine Dispose-Methode aufrufen oder Sie werden leak. Die Control-Klasse ist noch spezieller (siehe Duplikat für weitere Details). Sie müssen unbedingt die Dispose-Methode für jedes Steuerelement aufrufen, das Sie dynamisch von seinem übergeordneten Element entfernen. Der richtige Weg wäre, "entsorgt" durch "nicht referenziert" zu ersetzen. –

Verwandte Themen