2016-12-17 1 views
0

Ich habe vor kurzem einige (grundlegende) unbehandelte Fehlerhandler in meiner C# (WinForms) -Anwendung implementiert. Der UnhandledExceptionEventHandler funktioniert gut, aber im ThreadExceptionEventHandler finde ich etwas seltsam.C# /. NET ThreadException - Fehler beim Erstellen von Fenster Handle

Nach dem Schließen der Anwendung, über this.Close(), Standard WinForms schließen Sie die Schaltfläche, Application.Exit(), etc. etwas verursacht einen sehr kurzen Fehler beim Schließen der Anwendung.

Der Stack-Trace wird protokolliert, aber alle es mir das gibt ist:

System.ComponentModel.Win32Exception (0x80004005): Error creating window handle. 
at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp) 
at System.Windows.Forms.Control.CreateHandle() 
at System.Windows.Forms.Control.get_Handle() 
at System.Windows.Forms.Control.CreateGraphicsInternal() 
at System.Windows.Forms.ThreadExceptionDialog..ctor(Exception t) 
at System.Windows.Forms.Application.ThreadContext.OnThreadException(Exception t) 
at System.Windows.Forms.Control.WndProcException(Exception e) 
at System.Windows.Forms.Control.ControlNativeWindow.OnThreadException(Exception e) 
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 

Die Anwendung läuft dann, scheinbar normal zu schließen. Meine beste Vermutung ist eine Form von Speicherleck oder unsachgemäß gehandhabten Task-Shutdown, aber nichts, was ich bisher im Internet finden konnte, war sehr hilfreich.

Alle Ideen und Vorschläge sind willkommen. Vielen Dank im Voraus

UPDATE: Interessanterweise hat der Fehler aufgehört zu erscheinen ... Nicht sicher warum. Ich gehe jedoch davon aus, dass es zurückkehren könnte. Eine längerfristige Lösung wäre wunderbar.

+0

Schließen Sie Ihre Threads ordnungsgemäß ab, bevor Sie die Anwendung beenden? – bansi

+0

Es ist ein * sehr * häufiger Fehler in einer Winforms App, Programmierer verstehen die Gefahr der Methoden Controls.Clear() und Controls.Remote/At() nicht gut genug. Sehr oft falsch verwendet, nicht bewusst, dass sie stattdessen Dispose() verwenden sollten. Zusätzlicher Spaß, denn wenn die Kontrollen undicht sind, wird das Programm abstürzen. –

Antwort

0

Wie Bansi sagte: Wenn Sie ein Formular in Ihrer WinForm-Anwendung schließen, stellen Sie sicher, dass alle Threads, die dieses Formular verwenden, zuvor heruntergefahren wurden. Die letzte Zeile des Stack-Trace (System.Windows.Forms.NativeWindow.Callback) gibt den Hinweis, der a-Thread versucht, eine Nachricht an das Formular zu senden, das bereits geschlossen ist und kein Fenster-Handle mehr hat.