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

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

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

9 ответов

Решение

Из 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 не работает?

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

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,

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

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

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

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

Все, что тебе нужно System.Environment.Exit(1);

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

Вы делаете:

Application.Run(myForm);

в вашем главном ()?

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

Просто используйте

      this.Close();

или

      System.Environment.Exit(1);

Я бы выбрал одно из следующих:

Application.Exit ();

для формы или

Environment.Exit(0);

для консольного приложения (работает также на winforms).

Спасибо!

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

В этом случае наиболее подходящий способ выхода из приложения - переопределить метод onExit() в App.xaml.cs:

protected override void OnExit(ExitEventArgs e) {
    base.OnExit(e); 
}
Другие вопросы по тегам