Как правильно выйти из приложения на C#?
У меня есть опубликованное приложение в C#. Проблема здесь заключается в том, что всякий раз, когда я закрываю основную форму, нажав на красную кнопку выхода, она закрывает форму, но не закрывает приложение. Я узнал об этом, когда попытался выключить компьютер, надеясь, что приложение, которое я сделал, работает гладко, тогда я был бомбардирован множеством дочерних окон, с которыми я поставил MessageBox оповещения.
я попробовал приложения.Выход, но он по-прежнему вызывает все дочерние окна и оповещения, и я не знаю, как использовать окружающая среда.Выход и какое число ставить в него. Кстати, всякий раз, когда мои формы вызывают событие formclosed или form closing, я закрываю приложение с помощью . Это влияет на то, как мне сейчас вести себя?
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
totrue
поток не будет держать программу открытой. Такие вещи, как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()?
Я нашел это очень простой способ убить приложение, когда форма закрыта.