Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
InvalidOperationException beim Schließen des Programms
[email protected]
myCSharp.de - Member



Dabei seit:
Beiträge: 290

Themenstarter:

InvalidOperationException beim Schließen des Programms

beantworten | zitieren | melden

Hallo ich bekomme reproduzierbar folgende Fehlermeldung:
Fehler
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?
private Nachricht | Beiträge des Benutzers
Ahrimaan
myCSharp.de - Member



Dabei seit:
Beiträge: 363
Herkunft: Thorn

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
[email protected]
myCSharp.de - Member



Dabei seit:
Beiträge: 290

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo [email protected],

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
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4318
Herkunft: Zentralschweiz

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers