Когда следует использовать Environment.Exit для завершения консольного приложения?

Я поддерживаю несколько консольных приложений на работе, и одна вещь, которую я заметил в ряде из них, это то, что они вызывают Environment.Exit(0).

Пример программы будет выглядеть так:

public class Program
{
    public static void Main(string[] args)
    {
        DoStuff();
        Environment.Exit(0);
    }
}

Я не понимаю, в чем заключалось намерение первоначального программиста? На мой взгляд, даже без инструкции Environment.Exit программа должна выйти просто отлично. Тем не менее, для одной из этих программ консольное окно осталось даже после того, как оно должно было закрыться, поэтому я действительно не уверен, что происходит там.

Я что-то упустил? Или есть причина, почему Environment.Exit следует вызывать в этом случае?

Ответ 1

Единственная причина для вызова Exit() в качестве последней строки метода Main - если есть другие запущенные потоки переднего плана. Они останутся бегущими, если исполнение просто упадет с конца Main. Даже в этом случае, как правило, лучше было бы либо вставить некоторое явное изящное завершение в другие потоки, либо начать их с фоновых потоков.

Если вы хотите вернуть другой код выхода из Main, более простой способ добиться этого - объявить его возвратом int.

Короче говоря, я не думаю, что вам нужно Environment.Exit() здесь, и стоит спросить своих коллег о том, почему они используют его - скорее всего, они не смогут дать вам вескую причину, и это другое бит пуха, который вы можете вырезать.

Ответ 2

В основном оператор Environment.Exit(0) сообщает операционной системе, что это "чистый" выход. Существуют и другие числа, каждый из которых имеет другое значение, например Environment.Exit(1)

Однако следует отметить, что "Main" объявлен как возвращающий ничего "void", поэтому код выхода действительно не имеет для него значения.

На всякий случай, когда вы хотели узнать больше о разных кодах выхода, посмотрите здесь

системные коды ошибок

Ответ 3

Это [совместимость] для программ командной строки, указывающих на успех или неудачу базовой оболочки, и наследуется от более старых основных циклов C-стиля, где прототипом основной функции был

int main(void);

int main(int argc, char *argv[]);

Возвращаемое значение 0 традиционно означало успех, в то время как ненулевой означает отказ или что-то еще, в зависимости от того, что решил программист.

Ссылка:

wiki для получения дополнительной информации о функции main.

Документация MSDN на Environment.Exit()

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

Ответ 4

Это действительно используется, когда другие приложения ждут результата вашего консольного приложения. Например, SSRS (инструмент) может запустить консольное приложение и ждет ответа об успешном ответе на отказ. Environment.Exit(0) отправляет успешное сообщение о выполнении.

Ответ 5

В SSIS, когда у вас есть задача выполнения процесса, и вы хотите знать, является ли процесс неудачным, этот метод полезен.

Ответ 6

В ядре .net, на данный момент, необходимо использовать Environment.Exit чтобы завершить свою программу на Mac. Чистый возврат из main не останавливает процесс и продолжает работать, пока пользователь не прервет его. Шаблоны как:

public class Program
{
    public static void Main(string[] args)
    {
        Environment.Exit(TryRun(args));
    }
}

на моем рабочем месте, потому что мы хотим поставлять для Windows и Mac.