Announcement

Collapse
No announcement yet.

Exception beim beenden über X

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Exception beim beenden über X

    Hallo,

    wenn ein Thread im Hintergrund läuft und ich meine Applikationsfenter über das X beende, bekomme ich eine TargetInvacationException.

    Über das Menü beende ich dei Applikation mit
    Application.Exit()
    was auch richtig funktioniert.

    Wie kann ich diese Exception vermeiden?

    mfg

  • #2
    Ich glaube Du solltest etwas mehr posten. Die Beschreibung ist nicht sehr eindeutig und die Glaskugel funktioniert heut irgendwie nicht so richtig.

    Comment


    • #3
      Hallo,

      der Hintergrundthread wird beim Beenden der Anwendung auch beendet. Es ist jedoch nicht deterministisch ob der Hintergrundthread vor dem GUI-Thread beendet wird, da beide unabhängig sind.

      Es könnte passieren - und in deinem Fall scheint es als ob es passiert - dass der GUI-Thread beendet ist und der Hintergrundthread noch nicht und dieser eine Aktion über Control.Invoke in der GUI durchführt. Dann kommt ein Invocation-Fehler.

      Abhilfe ist demnach den Hintergrundthread "manuell" zu beenden bevor die Anwendung beendet wird.


      mfG Gü


      PS: @fanderlf: Mit einer Glaskugel geht das nicht, aber mit einer Kristallkugel
      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

      Comment


      • #4
        die Glaskugel funktioniert heut irgendwie nicht so richtig.
        Gleich für Ersatz sorgen......

        http://www.witchshop.de/ritualzubeho...geln/index.php

        (mit Anleitung....)
        Christian

        Comment


        • #5
          Oh man... und ich starre da Stunden lang rein und wundere mich warum nix passiert. Ausserdem könnt ich auch mal ne Anleitung dafür brauchen...

          Aber jetzt wieder Schluss mit Dummfug schreiben. Wollen ja dem Threadersteller nicht den Thread kaputt machen.

          Comment


          • #6
            Was passiert wenn du statt

            Application.Exit()

            die Anwendung ebenfalls mit einem Close()-Aufruf auf das Hauptformular beendest?

            Comment


            • #7
              Hallo,

              das Hauptformular zu beenden ist IMHO eleganter ändert aber nichts an der Problematik die in meiner vorigen Antwort steht.

              Ein sauberes Beenden muss wie folgt ablaufen:
              1. beenden (nicht killen) aller Threads die Aktionen auf die GUI ausüben
              2. GUI-Thread (Hauptformular) beenden

              Wann alle anderen Threads beendet werden ist wurscht.


              mfG Gü
              "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

              Comment


              • #8
                Originally posted by gfoidl View Post
                das Hauptformular zu beenden ist IMHO eleganter ändert aber nichts an der Problematik die in meiner vorigen Antwort steht.
                Ist mir schon klar. Ich will nur sicher sein das der Fehler nur aufgrund des "härteren" beendens mit Application.Exit die Fehlermeldung nur verhindert wird und der eigentliche Fehler nicht behoben ist.

                Comment


                • #9
                  Originally posted by Christian Marquardt View Post
                  Gleich für Ersatz sorgen......
                  Der richtige Link lautet z.B. FIS: Suche nach Foidl. Und ihr könnt sicher sein, dass Gü sich um Ersatz bemüht. Jürgen

                  Comment


                  • #10
                    Originally posted by Jürgen Thomas View Post
                    Der richtige Link lautet z.B. FIS: Suche nach Foidl. Und ihr könnt sicher sein, dass Gü sich um Ersatz bemüht. Jürgen
                    Warum so bescheiden Jürgen
                    Ein sehr guter Autor hat einen Wiki-Beitrag darüber verfasst: http://de.wikipedia.org/wiki/G%C3%BCnther_Foidl


                    Es ist zwar ziemlich offtopic aber mir gefällts


                    Aber nun wieder zurück zum Thema, bitte.


                    mfG Gü
                    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                    Comment


                    • #11
                      Originally posted by gfoidl View Post
                      Hallo,

                      das Hauptformular zu beenden ist IMHO eleganter ändert aber nichts an der Problematik die in meiner vorigen Antwort steht.

                      Ein sauberes Beenden muss wie folgt ablaufen:
                      1. beenden (nicht killen) aller Threads die Aktionen auf die GUI ausüben
                      2. GUI-Thread (Hauptformular) beenden

                      Wann alle anderen Threads beendet werden ist wurscht.


                      mfG Gü
                      ich würde noch darauf hinweisen, dass "Beenden" auch "warten bis beendet wurde" bedeutet. Stichwort ManualResetEvent

                      Comment


                      • #12
                        Hallo,

                        stimmt.


                        mfG Gü
                        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                        Comment


                        • #13
                          mein problem ist eher, dass ich nicht weiss wie man eine funktion erstellt die ausgeührt wird wenn man die applikation über x oben rechts am fensterrand schliesst.

                          Comment


                          • #14
                            Über das x schließt du die Form nicht die Applikation. Wenn die Form zufällig auch die Mainform war die zuerst gestartet wurde wird auch die Applikation beenden zumindest dann wenn kein sperrender anderer Foreground Thread läuft.

                            Aber das ist dir vermutlich bewußt. Ich habe es nur nochmal erwähnt um dir aufzuzeigen wo du zu suchen hast. Nämlich an der Form.
                            Die Form hat für ihr schließen natürlich Events. Wen du also auf das schließen der Form reagieren willst mußt du entweder den FormClosing oder den FormClosed Event abfangen.

                            Comment


                            • #15
                              Originally posted by Hans-Peter Tschan View Post
                              ich würde noch darauf hinweisen, dass "Beenden" auch "warten bis beendet wurde" bedeutet. Stichwort ManualResetEvent
                              was heisst denn warten bis beendet wurde programmtechnisch?

                              Comment

                              Working...
                              X