Laden...

InvalidOperationException beim Schließen des Programms

Erstellt von Andreas@Tricept vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.769 Views
A
Andreas@Tricept Themenstarter:in
289 Beiträge seit 2006
vor 12 Jahren
InvalidOperationException beim Schließen des Programms

Hallo ich bekomme reproduzierbar folgende Fehlermeldung:

Fehlermeldung:
Invoke oder BeginInvoke kann für ein Steuerelement erst aufgerufen werden, wenn das Fensterhandle erstellt wurde.
bei System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
bei System.Windows.Forms.Control.BeginInvoke(Delegate method, Object[] args)
bei System.Windows.Forms.WindowsFormsSynchronizationContext.Post(SendOrPostCallback d, Object state)
bei System.Windows.Forms.AxHost.OleInterfaces.Finalize()

das beschäftigt mich schon längere Zeit, jedoch kriege ich das Problem einfach nicht gelöst. Ich starte mein Programm in Visual Studio, schließe ich es dann bekomme ich oben genannten Fehler. Weiss jedoch nicht wo sich das Programm gerade befindet. In den Threads sehe ich nur noch den GC-Thread der gerade aktiv ist.

Weis jemand wie ich diesen Fehler beheben kann. Oder was mögliche Ansatzpunkte wären. Die Anwendung ist nicht gerade klein und ich bräuchte einen Anhaltspunkt zum suchen.
Oder lässt sich dieser Fehler auch irgendwie unterdrücken? Das würde mir reichen.
Denn es entsteht kein Fehlverhalten. Alles wird beim Schließen korrekt durchgeführt, nur den Kunden stört es immer das am Ende ein "Das Programm funktioniert nicht mehr" Fenster kommt. Kann mir jemand helfen?

A
350 Beiträge seit 2010
vor 12 Jahren

Hi,

anscheinend läuft in deiner Anwendung ein Thread welcher nicht beendet ist und per Invoke noch auf etwas zugreifen möchte.

Das heißt du schließt dein Hauptfenster bevor der Thread fertig ist.

A
Andreas@Tricept Themenstarter:in
289 Beiträge seit 2006
vor 12 Jahren

Hallo, ich habe jetzt alle Threaderstellungen unterdrück.
Sprich ich bin die Schlüsselwörter "new Thread", ".Tick", ".DoWork" durchgegangen und habe alle Timer, Threadinstanziierungen und Backgroundworker unterdrückt indem ich vorher ein return eingefügt habe.
Jedoch gelange ich immernoch zum gleichen Fehler.

Meinst du andere Threads? Ich benutze prinzipiell auch Word, Excel, Adobe PDF, kann es an diesen Programmen liegen?

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Andreas@Tricept,

das Problem scheint doch der GC-Thread zu sein. Da nützt es dann nichts, andere Threads zu vermeiden.

Der StackTrace zeigt doch sehr schön den Ablauf. Der Finalizer von AxHost.OleInterfaces macht ein WindowsFormsSynchronizationContext.Post und das nunmal ein Control.BeginInvoke und das klappt nicht, wenn das Fenster, auf das BeginInvoke angewendet wird (bzw. genauer der Handle dieses Fensters), bereits zerstört ist.

Mich wundert zwar ein bisschen, dass dieses Fenster schon zerstört ist, denn meiner Erinnerung nach benutzt WindowsFormsSynchronizationContext ein eigenes Fenster, aber wenn schon (explizit oder implizit) ein Application.Exit durchgeführt wurde, sind natürlich alle Fenster weg.

Wenn ein Objekt einen Finalizer hat, dann sollte es auch IDisposable implementieren. Und wenn es da tut, wäre eine Lösung, rechtzeitig vor dem Schließen der Fenster Dispose aufzurufen. Oder du musst auf andere Weise die AxHost bzw. Ole-Objekte rechtzeitig zerstören. Anders wird es kaum gehen.

herbivore

4.221 Beiträge seit 2005
vor 12 Jahren

Vermutlich verwendest Du Events des Ole-Controls.

Häng diese ab bevor Du beendest... ev. bringt das schon was.

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...