c#: Win32Exception: Fehler beim Erstellen des Fensterhandles

Wann tritt diese Exception auf? – Wenn zu viele Steuerelemente erstellt und nicht wieder aufgeräumt wurden.

Beispiel

View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
    public partial class Form1 : Form
    {
        void ForceException()
        {
            while (true)
            {
                Label l = new Label();
                this.Controls.Add(l);
                this.Controls.Clear();
            }
        }
    }

Bei jedem Schleifendurchlauf wird ein neues Label erstellt. mit this.Controls.Clear(); wird das Label zwar entfernt, aber das Fenster-Handle des Labels existiert weiterhin. Da jeder Prozess nur begrenzt viele Fenster-Handles haben kann sind diese irgendwann aufgebraucht.

Abhilfe

View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
13
    public partial class Form1 : Form
    {
        void ForceException()
        {
            while (true)
            {
                Label l = new Label();
                this.Controls.Add(l);
                this.Controls.Clear();
                l.Dispose();
            }
        }
    }

Mit l.Dispose(); werden alle Ressourcen, die das Label reserviert hatte freigegeben. Damit wird auch das Fenster-Handle wieder frei und kann später wieder verwendet werden. Die obige while-Schleife läuft beliebig lange ohne Fehler.

3 Kommentare

  • Von Marcus, 10. Februar 2010 @ 14:14

    Danke für den Tip, habe auch grad ein solches Problem.
    Dispose() ist hier wirklich zwingend notwendig.

  • Von Sebastian, 1. April 2010 @ 09:18

    Ich habe nun auch den Fehler bekommen. Jedoch sind das dort komische Umstände. Ich habe eine Form (FormA), die als modul von einer anderen Form (FormB) geladen wird. FormB holt sich dann die Statuszeile und den toolStrip von FormA und zeigt diese als eigene an. Wenn ich nun erst das Modul (FormA) schließe und dann FormB, läuft alles und es funktioniert. Wenn ich aber FormB schließe, dann gebe ich erst die Statusleiste und den ToolStrip zurück. Dann wird dies Disposed und ruft das Dispose von meinem Modul (FormA) auf. Wenn mein Modul (FormA) dann die Komponenten disposen will, knallt es mit dieser Exception weg.
    Erst einmal ist es nun so gelöst, dass alle Module die geöffnet werden im FormClosing-Event manuell geschlossen und disposed werden. Jedoch muss es ja irgend einen Grund geben, warum das nicht automatisch passiert. Und der würde mich mal interessieren. Falls du diesen Grund kennst und vlt weiß wo man ungefähr ansetzen muss, dann wäre ich dir sehr dankbar.

  • Von Simon Ottenhaus, 1. April 2010 @ 10:43

    Ich schlage Folgendes zur Lösung vor:

    1. Reproduziere das Problem in einem kleinen abgeschlossenen Beispiel, und steppe es durch. (Hast du eventuell eine Endlosschleife oder Rekursion drin?)

    2. Wenn du das Problem nicht selbst beheben kannst poste das ganze auf http://stackoverflow.com/


    Ich habe leider momentan keine Zeit mich mit deinem Problem im Detail zu befassen.

Andere Links zu diesem Artikel

RSS Feed für Kommentare zu diesem Artikel. TrackBack URI

Hinterlasse einen Kommentar

WordPress Themes