Как правильно выйти из приложения С#?

У меня есть опубликованное приложение на С#. Проблема здесь в том, что когда я закрываю основную форму, нажимая на красную кнопку выхода, она закрывает форму, но не закрывает приложение. Я узнал об этом, когда попытался выключить компьютер, надеясь, что приложение, которое я сделал, работает плавно, тогда меня обрушило много дочерних окон, с которыми я разместил оповещения MessageBox.

Я попробовал Application.Exit, но он все равно вызывает все дочерние окна и предупреждения, и я не знаю, как использовать Environment.Exit и какое целое для ввода в него. Кстати, всякий раз, когда мои формы вызывают закрытие формы или закрытие формы, я закрываю приложение с помощью функции this.Hide(). Это влияет на поведение моего приложения сейчас?

Ответ 1

Из MSDN:

Application.Exit

Сообщает все насосы сообщений, которые они должны завершить, а затем закрывает все окна приложений после того, как сообщения были обработаны. Это код для использования, если вы вызвали Application.Run(приложения WinForms), этот метод останавливает все запущенные петли сообщений во всех потоках и закрывает все окна приложения.

Environment.Exit

Завершает этот процесс и предоставляет базовой операционной системе указанный код выхода. Это код для вызова, когда вы используете консольное приложение.

В этой статье Application.Exit vs. Environment.Exit указывает на хороший совет:

Вы можете определить, был вызван ли System.Windows.Forms.Application.Run, проверяя свойство System.Windows.Forms.Application.MessageLoop. Если true, то вызывается Run, и вы можете предположить, что приложение WinForms выполняется следующим образом.

if (System.Windows.Forms.Application.MessageLoop) 
{
    // WinForms app
    System.Windows.Forms.Application.Exit();
}
else
{
    // Console app
    System.Environment.Exit(1);
}

Ссылка: Почему Application.Exit не работает?

Ответ 2

Я знаю, что это не проблема, которая у вас была, однако другая причина, по которой это может произойти, заключается в том, что в вашем приложении есть нефонический поток.

using System;
using System.Threading;
using System.Windows.Forms;

namespace Sandbox_Form
{
    static class Program
    {
        private static Thread thread;

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            thread = new Thread(BusyWorkThread);
            thread.IsBackground = false;
            thread.Start();

            Application.Run(new Form());

        }

        public static void BusyWorkThread()
        {
            while (true)
            {
                Thread.Sleep(1000);
            }
        }
    }
}

Когда IsBackground есть false, он будет держать вашу программу открытой до тех пор, пока поток не завершится, если вы установите IsBackground на true, нить не остановит программу. Такие вещи, как BackgroundWoker, ThreadPool и Task, внутренне используют поток с IsBackground, установленным в true.

Ответ 3

Все, что вам нужно, это System.Environment.Exit(1);

И он использует системное пространство имен "using System", которое почти всегда присутствует при запуске проекта.

Ответ 4

Кстати. когда мои формы называют событием закрытия формы или формы, я закрываю приложение с помощью функции this.Hide(). Это влияет на поведение моего приложения сейчас?

Короче говоря, да. Вся заявка закончится, когда основная форма (форма, запущенная с помощью Application.Run в методе Main) закрыта (не скрыта).

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

Если вы хотите, чтобы пользователь нажал кнопку "x" для вашей основной формы, но остался открытым и, по сути, стал "новой" основной формой, а затем немного сложнее. В таком случае вам нужно просто скрыть свою основную форму, а не закрывать ее, но вам нужно будет добавить какой-то механизм, который фактически закрывает основную форму, когда вы действительно хотите, чтобы ваше приложение закончилось. Если это та ситуация, в которой вы находитесь, вам нужно будет добавить дополнительные сведения к вашему вопросу, описывающие, какие типы приложений должны и на самом деле не должны заканчивать программу.

Ответ 5

Вы выполняете:

Application.Run(myForm);

в вашем Main()?

Я нашел это очень простым способом убить приложение, когда форма закрыта.

Ответ 6

Environment.Exit(exitCode); //exit code 0 is a proper exit and 1 is an error