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


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

я попробовал приложения.Выход, но он по-прежнему вызывает все дочерние окна и оповещения, и я не знаю, как использовать окружающая среда.Выход и какое число ставить в него. Кстати, всякий раз, когда мои формы вызывают событие formclosed или form closing, я закрываю приложение с помощью . Это влияет на то, как мне сейчас вести себя?

8 139

8 ответов:

от MSDN:

приложение.Выход

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

окружающая среда.Выход

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

этой статье приложение.Выход против окружающей среды.Выход, указывает на хороший совет:

вы можете определить, если 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);
}

ссылки: почему бы приложение.Выход не работает?

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

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 to true поток не будет держать программу открытой. Такие вещи, как BackgroundWoker,ThreadPool и Task все внутренне используют поток с IsBackground значение true.

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

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

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

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

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

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

Do you do:

Application.Run(myForm);

в ваш main()?

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

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

приложение.Exit ();

для winform или

окружающая среда.Выход(0);

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

спасибо!

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

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

protected override void OnExit(ExitEventArgs e) {
    base.OnExit(e); 
}