Application.Restart() Environment.Exit(0) konflikt

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Application.Restart() Environment.Exit(0) konflikt

    Hallo habe widermal ein problem.


    Ich habe ein button wo meine culture geladen werden (Sprache ändern) danach fürhre ich einem Application.Restart() dursch.

    Nun ist das aber so das beim restarten das Environment.Exit greift und die application gekilt wird anstadt sie zu restarten.

    VB.NET-Quellcode

    1. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) Handles Me.FormClosing
    2. e.Cancel = True
    3. Environment.Exit(0)
    4. End Sub


    wie kann ich das problem lösen?
    Application.Exit() im FormClosing bringt mir nix dann wird die application geschlossen je nach dem ob e.cancel true ist oder false aber die läuft im hintegrund weiter.... ?(

    seby1302 schrieb:

    Ich habe ein button
    Dies allein genügt:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. ' was tun
    3. Application.Restart()
    4. End Sub

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany nein das genügt um sie neu zu starten, aber dadurch wird eben FormClosing ausgeführt, was wieder rum dazu führt das sich die Exe komplett beendet.

    ​Warum brauchst du überhaupt ein ​Environment.Exit(0) die Form schließt sich doch auch so...
    Die Lösung davon wäre eine globale Variable die du setzt und dann Application.Restart aufrufst. In FormClosing wird abgefragt ob die Variable gesetzt ist. Ist sie nicht gesetzt führst du e.Cancel und Environment.Exit(0) aus. Sonst machst du garnix.
    Die schönere Lösung wäre das Ganze über die EventArgs zu erkennen (falls diese das mitliefern).​

    Lg Mokki
    ​Smartnotr - ein intelligentes Notizprogramm
    zum Thread

    RodFromGermany schrieb:

    Teste meinen Snippet


    Ok.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Application.Restart()
    3. End Sub
    4. Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    5. e.Cancel = True
    6. Environment.Exit(0)
    7. End Sub


    Ergebnis: Exe wurde nie wieder gesehen....

    Lg Mokki
    ​Smartnotr - ein intelligentes Notizprogramm
    zum Thread

    RodFromGermany schrieb:

    Dies allein genügt

    @Mokki In meinem Snippet kommt Form_Closing nicht vor :!:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Mokki schrieb:

    sein Problem
    Er muss das Form_Closing-Exit(0) rausschmeißen und an einer geeigneter Stelle Application.Restart() aufrufen.
    Feddich. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Mokki schrieb:

    Die schönere Lösung wäre das Ganze über die EventArgs zu erkennen (falls diese das mitliefern).​


    VB.NET-Quellcode

    1. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) Handles Me.FormClosing
    2. If e.CloseReason = CloseReason.UserClosing Then
    3. e.Cancel = True
    4. Environment.Exit(0)
    5. End If
    6. End Sub​

    Aber ich würde mich wirklich ernsthaft fragen, warum ich meine Anwendung so knallhart abschiessen muss.
    Das deutet für mich auf Designfehler hin.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @petaod @Mokki Ist doch Tinnef.
    Das FormClosing-Event wird doch geworfen, wenn die Applikation geschlossen wird.
    Das .Cancel = True dient dazu, die Applikation nicht zu beenden, wenn z.B. Daten nicht gesichert sind.
    CloseReason.UserClosing tritt z.B. ein, wenn auf das Kreuz rechts oben geklickt wird.

    VB.NET-Quellcode

    1. e.Cancel = True
    2. Environment.Exit(0)
    macht in dieser Kombination also gar keinen Sinn!
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das Cancel macht wirklich keinen Sinn, stört aber auch nicht, weil nach dem Exit sowieso nichts mehr passiert.

    Ich verstehe das so, dass wenn die Form durch den User geschlossen wird, dass er die komplette Anwendung gnadenlos abschiessen will.
    Wahrscheinlich stimmt sein übriger Workflow nicht und deswegen wählt er diesen verzweifelten Weg.

    Wenn das Programm jedoch sich selbst restarten will, funktioniert das nicht mehr, weil durch den gnadenlosen Abbruch auch der Restart nicht mehr funktioniert.
    Deswegen die Abfrage, ob es ein benutzerbedingter Close oder ein vom Programm selbst verursachter Close ist, damit im zweiten Fall die Holzhammermethode nicht angewendet wird.

    Ich würde mir als TE allerdîngs Gedanken machen, warum das Programm sich nicht selbst sauber aufräumt ich den Exit überhaupt brauche.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo leute

    Das Environment.Exit(0) benutze ich da komischrweißer bei mein app mit Application.Exit() die application geschloßen wird, diese aber im hintegrund weiter läuft, heist das prozess ist dann noch vorhanden und ich würde jedes mal wen ich mein app starte ein neues prozess starten bis ich unendlich viele am laufen hätte.

    anders sieht es aus wenn ich aber jergend etwas auswerte.

    z.b
    if blabla = true then
    Application.Exit()
    end if

    wen jetzt blabla true ist dann wird mein app komplet geschloßen ohne ein bleibendes prozess im hintergrund.

    aber mit

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Application.Exit()
    3. End Sub

    Würde mein form geschlossen werden, das prozess würde aber komischerweiße im hintergrund weiter laufen, deshalb arbeite ich da noch am fehler behebung mit Option strict On nur das ich da nicht ganz durch blicke...

    z.b

    VB.NET-Quellcode

    1. If GameComboBox.SelectedItem = ""
    2. Fehler 12 "Option Strict On" lässt Operanden des Typs "Object" für den =-Operator nicht zu. Verwenden Sie den Is-Operator, wenn Sie die Objektidentität testen möchten.
    3. änder ich zu if GameComboBox.SelectedItem is ""
    4. passiert nix mehr an dieser stelle ?(


    hab jetzt jedoch den Application.Restart() ganz raus gehauen und änder meine culture wärhrend der laufzeit sollte auch die besere lösung sein denke ich.
    If ComboBox1.SelectedItem Is Nothing Then

    Übrigens ist GameComboBox als Name nicht gut gewählt. ComboBoxGame, ist wesentlich besser, weil dir Intellisence dann alle ComboBoxes hintereinander auflistet.

    seby1302 schrieb:

    VB.NET-Quellcode

    1. Application.Exit()

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. Application.Restart()
    Finde den Unterschied.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!