Freigeben von Formularen

09/01/2010 - 09:10 von frank fricke | Report spam
Hallo,

ich bin noch absolut am Anfang mit der Programmierung und habe mal
eine Frage zum Beenden und Freigeben von Formularen, welche aus einem
anderen Formular heraus aufgerufen werden.

Ich habe mal ein einfaches Beispiel ausprobiert, in welchem ich ein
neues Formular mit einer Schaltflàche aufrufe und dann mit einer
anderen wieder schließe.

Dabei ist mir aufgefallen im Taskmanager (Vista), dass der
Arbeitsspeicher immer mehr zunimmt, je öfter ich das Formualr aufrufe
und wieder schließe.

Ist das Verhalten normal? Was geschieht mit den Benutzerdefinierten
Controls in dem aufgerufenen Formular? Werden diese auch beendet oder
wie kann ich dafür sorgen, dass der Speicher wieder freigegeben wird?
Das ist im Moment erst einmal meine wichtigste Frage.

Hier könnt ihr mal mein Beispiel sehen:

WindowsFormsApplication1.Form1 frm = null;
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
if (frm == null)
{
frm = new WindowsFormsApplication1.Form1();
frm.Show();
}
}

private void Form1_Load(object sender, EventArgs e)
{

}

private void button2_Click(object sender, EventArgs e)
{
frm.Close();
frm.Dispose();
frm = null;

}

Ist denn meine Vorgehensweise so OK?

Danke

Frank
 

Lesen sie die antworten

#1 Frank Dzaebel
09/01/2010 - 14:02 | Warnen spam
Hallo Frank Fricke,

Dabei ist mir aufgefallen im Taskmanager (Vista), dass der
Arbeitsspeicher immer mehr zunimmt, je öfter ich das
Formualr aufrufe und wieder schließe.



Bei ShowDailog() solltest Du explizit disposen, aber sonst
ist es ganz normal, dass ggf. Speicher-Verbrauch temporàr
zunimmt. Informiere Dich (ggf.) über das Prinzip der
Garbage-Collection:

[Garbage Collector-Grundlagen und Tipps zur Leistung]
http://msdn.microsoft.com/de-de/lib...73837.aspx

Der Speicher wird (überwiegend) dann zeitlich nicht
deterministisch "aufgeràumt", wenn eine gewisse
Speicherverbrauchs-Prozentsatz überschritten wurde.

Wenn Du in Deine Tests ein:

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

einbaust (was im aktuellen Betrieb nicht ratsam ist,
aber für Demo-Zwecke ...), solltest Du zum Beispiel
keinen Speicherverbrauchszuwachs beobachten.


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen