Was ist der Befehl zum Beenden einer Konsolenanwendung in C #?

256

Was ist der Befehl in C # zum Beenden einer Konsolenanwendung?

Sababoni
quelle

Antworten:

333

Sie können Environment.Exit(0);und verwendenApplication.Exit

Environment.Exit(0) ist sauberer .

Nikhil Agrawal
quelle
8
Nur neugierig, was macht es sauberer?
Grant H.
Dies funktionierte perfekt für mich, als ich einer Konsolen-App über stackoverflow.com/a/7865126/1530166 einen Timer hinzufügte . Application.Exit hat dies nicht getan, selbst wenn stackoverflow.com/a/37029044/1530166 verwendet wurde .
Jason Anderson
5
@GrantH. Es ist sauberer, weil es dem zugrunde liegenden Betriebssystem einen nützlicheren Fehlercode gibt, warum es beendet wird.
Fayssal El Mofatiche
Environment.ExitErfordert jedoch, dass Sie über die Berechtigungen SecurityPermissionFlag.UnmanagedCode verfügen - was für einige möglicherweise problematisch ist.
wp78de
93

Verschiedene Optionen in der Reihenfolge der am besten geeigneten Methode:

  1. Geben Sie ein int von der Program.Main-Methode zurück
  2. Eine Ausnahme auslösen und nirgendwo behandeln (für unerwartete Fehlersituationen verwenden)
  3. Um die Kündigung an anderer Stelle zu erzwingen System.Environment.Exit( nicht tragbar! Siehe unten )

Bearbeitet 9/2013, um die Lesbarkeit zu verbessern

Rückgabe mit einem bestimmten Exit-Code: Wie Servy in den Kommentaren ausführt, können Sie Main mit einem intRückgabetyp deklarieren und auf diese Weise einen Fehlercode zurückgeben. Es ist also wirklich nicht erforderlich, Environment.Exit zu verwenden, es sei denn, Sie müssen mit einem Exit-Code beenden und können dies möglicherweise nicht in der Main-Methode tun. Höchstwahrscheinlich können Sie dies vermeiden, indem Sie eine Ausnahme auslösen und einen Fehlercode in Main zurückgeben, wenn sich dort eine nicht behandelte Ausnahme ausbreitet. Wenn die Anwendung über mehrere Threads verfügt, benötigen Sie wahrscheinlich noch mehr Boilerplate, um ordnungsgemäß mit einem Exit-Code zu beenden, sodass Sie möglicherweise besser einfach Environment.Exit aufrufen können.

Ein weiterer Punkt gegen die Verwendung Evironment.Exit- selbst beim Schreiben von Multithread-Anwendungen - ist die Wiederverwendbarkeit . Wenn Sie Ihren Code jemals in einer Umgebung wiederverwenden möchten, die Environment.Exitirrelevant ist (z. B. in einer Bibliothek, die möglicherweise auf einem Webserver verwendet wird), ist der Code nicht portierbar. Die beste Lösung ist meiner Meinung nach immer, immer Ausnahmen und / oder Rückgabewerte zu verwenden, die darstellen, dass die Methode einen Fehler- / Endzustand erreicht hat. Auf diese Weise können Sie in jeder .NET-Umgebung und in jeder Art von Anwendung immer denselben Code verwenden. Wenn Sie speziell eine App schreiben, die einen Exit-Code zurückgeben oder auf ähnliche Weise beenden Environment.Exitmuss, können Sie den Thread auf höchster Ebene umbrechen und die Fehler / Ausnahmen nach Bedarf behandeln.

sinelaw
quelle
10
Diese letzte Option ist geschmacklos. Kein Programmierer möchte ein Programm durch Auslösen einer Ausnahme beenden.
Nikhil Agrawal
5
Wie ich schrieb "in der Reihenfolge der am besten geeigneten". Außerdem ist in bestimmten Situationen das Auslösen einer Ausnahme der richtige Weg (z. B. wenn ein unerwarteter, schwerwiegender Fehler auftritt, der nicht auftreten sollte und von dem die Anwendung niemals wiederhergestellt wird). Ich habe die Antwort aktualisiert, um dies zu klären.
Sinelaw
Wenn Sie sich in Main befinden, können Sie einfach 0, 1 usw. zurückgeben und die Methodensignatur als Rückgabe eines int markieren, um einen Fehlercode zurückzugeben. Sie MÜSSEN nicht Environment.Exit verwenden, um einen Fehlercode anzugeben.
Servy
2
Hängt davon ab, wie tief Sie im Aufrufstapel sind und ob Sie sich im Hauptthread befinden. Es kann einfacher sein, Environment.Exit aufzurufen, als Ihr gesamtes Programm so zu gestalten, dass es vollständig zur Hauptfunktion zurückkehrt, ohne eine Ausnahme zum Abwickeln des Aufrufstapels zu verwenden (was in einem Hintergrundthread nicht funktionieren würde; entweder würde der ThreadPool verschlucken die Ausnahme oder würde es unbehandelt wegwerfen, so oder so würde jede Fanglogik in der Hauptmethode oder im Thread es niemals sehen.
KeithS
Ich habe die Reihenfolge der Optionen geändert. Das Auslösen einer Ausnahme hat den Vorteil, dass die Wiederverwendung Ihres Codes als Bibliothek in verschiedenen ausführbaren Umgebungen erheblich vereinfacht wird.
Sinelaw
26

Konsolenanwendungen werden beendet, wenn die Hauptfunktion ausgeführt wurde. Eine "Rückkehr" wird dies erreichen.

    static void Main(string[] args)
    {
        while (true)
        {
            Console.WriteLine("I'm running!");
            return; //This will exit the console application's running thread
        }
    }

Wenn Sie einen Fehlercode zurückgeben, können Sie dies auf folgende Weise tun, auf die über Funktionen außerhalb des ursprünglichen Threads zugegriffen werden kann:

    System.Environment.Exit(-1);
Entwickler
quelle
9

Sie können Environment.Exit(0)und verwenden Application.Exit.

Environment.Exit(): Beendet diesen Prozess und gibt dem zugrunde liegenden Betriebssystem den angegebenen Exit-Code.

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
quelle