Что такое команда для выхода из консольного приложения в C #?

Ответы:

333

Вы можете использовать Environment.Exit(0);иApplication.Exit

Environment.Exit(0) чище .

Нихил Агравал
источник
8
Просто любопытно, что делает его чище?
Грант Х.
Это прекрасно сработало, когда я добавил таймер в консольное приложение через stackoverflow.com/a/7865126/1530166 . Application.Exit этого не делал, даже при использовании stackoverflow.com/a/37029044/1530166 .
Джейсон Андерсон
5
@GrantH. он чище, потому что дает базовой операционной системе более полезный код ошибки, почему он завершается.
Фейсал Эль Мофатиче
Однако Environment.Exitтребуется наличие разрешений SecurityPermissionFlag.UnmanagedCode - что может быть проблематично для некоторых.
wp78de
93

Несколько вариантов, в порядке наиболее подходящего способа:

  1. Вернуть int из метода Program.Main
  2. Создайте исключение и никуда не обрабатывайте
  3. Для принудительного завершения в другом месте System.Environment.Exit( не переносимо! См. Ниже )

Отредактировано 9/2013 для улучшения читабельности

Возврат с определенным кодом выхода: Как указывает Servy в комментариях, вы можете объявить Main с intтипом возврата и вернуть код ошибки таким образом. Таким образом, на самом деле нет необходимости использовать Environment.Exit, если только вам не нужно завершить работу с кодом выхода и вы не можете сделать это в методе Main. Скорее всего, этого можно избежать, создав исключение и вернув код ошибки в Main, если там распространяется какое-либо необработанное исключение. Если приложение является многопоточным, вам, вероятно, понадобится еще больше шаблонов для правильного завершения с кодом выхода, поэтому вам может быть лучше просто вызвать Environment.Exit.

Еще одно замечание против использования Evironment.Exit- даже при написании многопоточных приложений - это возможность многократного использования . Если вы когда-нибудь захотите повторно использовать свой код в среде, которая делает его Environment.Exitнеактуальным (например, библиотека, которая может использоваться на веб-сервере), код не будет переносимым. На мой взгляд, лучшим решением по-прежнему является использование исключений и / или возвращаемых значений, которые показывают, что метод достиг некоторого состояния ошибки / завершения. Таким образом, вы всегда можете использовать один и тот же код в любой среде .NET и в любом приложении. Если вы пишете специально приложение, которое должно возвращать код завершения или завершаться способом, аналогичным тому, что Environment.Exitпроисходит, вы можете продолжить и обернуть поток на самом высоком уровне и обработать ошибки / исключения по мере необходимости.

sinelaw
источник
10
Этот последний вариант плохой вкус. Ни один программист не хочет выйти из программы, выдав исключение.
Нихил Агравал
5
Как я уже писал "по порядку наиболее подходящий". Кроме того, в определенных ситуациях создание исключения является правильным способом (например, когда происходит непредвиденная, фатальная ошибка, которая не должна произойти, из-за которой приложение никогда не восстановится). Я обновил ответ, чтобы уточнить.
Синелав
Если вы находитесь в Main, вы можете просто вернуть 0, 1 и т. Д. И пометить сигнатуру метода как возвращающую int для возврата кода ошибки, вам НЕ НУЖНО использовать Environment.Exit для указания кода ошибки.
Обслуживание
2
Зависит от того, насколько глубоко вы находитесь в стеке вызовов и находитесь ли вы в основном потоке. Вызвать Environment.Exit может быть проще, чем спроектировать всю программу так, чтобы она полностью возвращалась к основной функции без использования исключения для размотки стека вызовов (который не будет работать из фонового потока; либо ThreadPool будет проглатывать) исключение или оно будет выброшено необработанным, в любом случае любая логика перехвата в основном методе или потоке никогда не увидит его
KeithS
Я изменил порядок опций. Выдача исключения имеет то преимущество, что значительно упрощает повторное использование кода в качестве библиотеки в различных исполняемых средах.
Синелав
26

Консольные приложения будут закрыты после завершения работы основной функции. «Возвращение» достигнет этого.

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

Если вы возвращаете код ошибки, вы можете сделать это следующим образом, который доступен из функций вне исходного потока:

    System.Environment.Exit(-1);
разработчик
источник
9

Вы можете использовать Environment.Exit(0)и Application.Exit.

Environment.Exit(): завершает этот процесс и дает базовой операционной системе указанный код выхода.

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
источник