2016-11-30 4 views
0

Also in meinem Formular Konstruktor habe ich eine Überprüfung für ein Argument. Wenn ich eines von zwei speziellen Argumenten bekomme, möchte ich einfach meinen Server registrieren/abmelden und das Programm schließen. Ich möchte nicht, dass das Formular in diesen Fällen geladen wird. Wie es derzeit aussieht, registriert/hebt der folgende Code erfolgreich den Server auf, aber es bringt meine Anwendung nicht gleich nach dem, wie ich es möchte. Irgendein anderer Befehl dazu? Oder gibt es vielleicht einen besseren Weg, um das zu tun, was ich versuche?Application.Exit Schließt mein Programm nicht, irgendwelche Alternativen?

Mein Code:

public Form1() 
    { 
     InitializeComponent(); 
     instance = this; 
     fillMeasView(); 

     string[] args = Environment.GetCommandLineArgs(); 
     if (args.Length > 1) 
     { 
      switch (args[1]) 
      { 
       case "register": 
        try 
        { 
         slikServer1.RegisterServer(); 
         MessageBox.Show("Server registered successfully!"); 
        } 
        catch(Exception ex) 
        { 
         MessageBox.Show("Error: Could not register server." + "\nAdditional Information: " + ex.Message, "Registering Server Failed", MessageBoxButtons.OK, MessageBoxIcon.Error); 
        } 
        Application.Exit(); 
        break; 
       case "unregister": 
        try 
        { 
         slikServer1.UnregisterServer(); 
         MessageBox.Show("Server unregistered successfully!"); 
        } 
        catch (Exception ex) 
        { 
         MessageBox.Show("Error: Could not unregister server." + "\nAdditional Information: " + ex.Message, "Unregistering Server Failed", MessageBoxButtons.OK, MessageBoxIcon.Error); 
        } 
        Application.Exit(); 
        break; 
       default: 
        MessageBox.Show("This is the cmd line arg:" + args[1]); 
        break; 
      } 
     } 

    } 
+5

Verschieben Sie diesen Code in die 'Main'-Methode (Anwendungseingangspunkt) und zeigen Sie kein Formular an, anstatt irgendetwas zu beenden. – Sinatr

+0

@Sinatr Sie sagen, um ein Haupt zu erstellen? Das wird Mehrdeutigkeit in Bezug auf den Startpunkt der Programme hinzufügen, nicht wahr? –

+0

Sie haben es bereits ... irgendwo;) Erstellen Sie keine neuen, verwenden/ändern bestehende. Es gibt sogar eine spezielle Version davon: siehe [diese Antwort] (http://stackoverflow.com/a/1179545/1997232). – Sinatr

Antwort

2

Sie wollen:

Environment.Exit(0); 
+0

Was genau macht dieser Befehl?Ich werde es jetzt versuchen, danke –

+0

@ J.Doe es tötet den Prozess und zuweisen ExitCode = 0 – Steve

+0

"Beendet diesen Prozess und gibt einen Exit-Code für das Betriebssystem." - [MSDN] (https://msdn.microsoft.com/en-us/library/system.environment.exit (v = vs.110) .aspx) – ThePerplexedOne

0

Sie Environment.Exit(0) verwenden können. Nicht-Null-Exit-Codes zeigen einen Fehler an.

Beendet diesen Prozess und gibt dem zugrunde liegenden Betriebssystem den angegebenen Beendigungscode. Dies ist der Code, der aufgerufen wird, wenn Sie die Konsolenanwendung verwenden.

Der Unterschied zu Application.Exit() wird deutlich, wenn man sich die Dokumentation anschaut.

Informiert alle Nachrichtenpumpen, die sie beenden müssen, und schließt dann alle Anwendungsfenster, nachdem die Nachrichten verarbeitet wurden.

Aber Vorsicht mit Environment.Exit(), da es den Prozess sofort tötet. Vielleicht möchten Sie untersuchen, warum Application.Exit() Ihre Anwendung nicht schließen kann.

+0

Noch lädt form1 für mich, wenn ich Environment.Exit :( –

+0

vergeuded nein es funktioniert dank :) –

0

Sie wollen diesen Code nicht wirklich im Formularkonstruktor. Suchen Sie stattdessen Ihren Einstiegspunkt (normalerweise eine statische Methode Main in der Datei Program.cs) und legen Sie sie dort ab.

Application.Exit ist schon ein bisschen ein schlechtes Zeichen - es zeigt, dass Sie nicht wirklich wissen, was Sie an diesem Punkt zu beenden versuchen. Der Grund, es nicht in Ihrem Fall nicht funktioniert ist, dass es keine Anwendung ist noch zu verlassen - die übliche Art und Weise eine WinForms-Anwendung gestartet wird, sieht etwa so aus:

Application.Run(new Form1()); 

Da Sie in Form Konstruktor sind, Application.Run didn 't run noch, also gibt es keine Nachrichtenschleife zum Beenden (was Application.Exit tut).

Sie haben auch direkten Zugriff auf Befehlszeilenargumente vom Einstiegspunkt - es ist ein Argument für die Main-Methode. Treffen Sie alle Ihre Entscheidungen dort, und nur wenn Sie die GUI-Anwendung tatsächlich ausführen möchten, tun Sie die Application.Run. Andernfalls kehren Sie einfach von Main zurück und Ihre Anwendung wird beendet (vorausgesetzt, Sie haben keine Vordergrund-Threads gestartet, die zu diesem Zeitpunkt noch aktiv sind).

Verwandte Themen