Почему Application.Exit не работает?
У меня есть приложение, которое получает странные ошибки при отмене из диалогового окна. Приложение не может продолжаться, если поле отменено, поэтому оно выходит, но по какой-то причине оно не работает, и поэтому оно продолжает работать и сработает.
Я отладил эту проблему, и как-то приложение запускается прямо после вызова Application.Exit. Я работаю в режиме отладки, и это актуально из-за небольшого количества кода, который зависит от определяемой переменной RELEASE. Вот мой код выхода из приложения. Я проследил код, и он ввел метод ExitApp и продолжает двигаться, возвращая управление вызывающему и в конечном итоге сбой.
Это приложение, которое предоставляет отчеты по удаленному подключению к рабочему столу, поэтому код выхода немного странный. Он пытается завершить удаленный сеанс, но только при запуске в рамках выпуска, потому что я не хочу закрывать свою машину dev для каждого тестового прогона.
private void ExitApp()
{
HardTerminalExit();
Application.Exit();
}
// When in Debug mode running on a development computer, this will not run to avoid shutting down the dev computer
// When in release mode the Remote Connection or other computer this is run on will be shut down.
[Conditional("RELEASE")]
private void HardTerminalExit()
{
WTSLogoffSession(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, false);
}
Я запустил отладчик прямо из строки Application.Exit, и ничего не происходит, затем управление возвращается к вызывающей стороне после того, как я пройду мимо этой строки.
Что происходит? Это приложение Windows Forms.
Ответы
Ответ 1
Это статья, которая расширяется по тому же пути мысли, который вы переживаете: http://www.dev102.com/2008/06/24/how-do-you-exit-your-net-application/
В основном:
-
Environment.Exit - из MSDN: завершает этот процесс и дает базовой операционной системы указанный код выхода. Это код для вызова при использовании консоли приложение.
-
Application.Exit - из MSDN: информирует все насосы сообщений, что они должен завершиться, а затем закрыть все окна приложений после сообщений были обработаны. Это код использовать, если вы вызвали Application.Run(WinForms приложений), этот метод останавливает все запуск циклов сообщений на всех потоках и закрывает все окна выражение. Есть еще несколько вопросы об этом методе, читайте о это на странице MSDN.
Другое обсуждение этого вопроса: http://geekswithblogs.net/mtreadwell/archive/2004/06/06/6123.aspx
В этой статье указывается хороший совет:
Вы можете определить, вызвана ли System.Windows.Forms.Application.Run, проверив свойство System.Windows.Forms.Application.MessageLoop. Если true, то вызывается Run, и вы можете предположить, что приложение WinForms выполняется следующим образом.
if (System.Windows.Forms.Application.MessageLoop)
{
// Use this since we are a WinForms app
System.Windows.Forms.Application.Exit();
}
else
{
// Use this since we are a console app
System.Environment.Exit(1);
}
Ответ 2
У этой проблемы в последнее время (что Application.Exit не смог правильно завершить сообщения насосов для win-форм с помощью Application.Run(new Form())), я обнаружил, что если вы создаете новые потоки или начинаете фоновые работники внутри конструктор, это предотвратит запуск приложения. Exit.
Переместить все вызовы "RunWorkerAsync" из конструктора в форму Метод загрузки:
public Form()
{
this.Worker.RunWorkerAsync();
}
Переместить в:
public void Form_Load(object sender, EventArgs e)
{
this.Worker.RunWorkerAsync();
}
Ответ 3
Попробуйте Environment.Exit(exitCode)
.
Ответ 4
Я пошел, хотя в этой ситуации во многих случаях я использую Thread.CurrentThread.Abort()
и процесс закрыт. Кажется, что Application.Exit не правильно подключается к текущему потоку.
Ответ 5
Также убедитесь, что все потоки, запущенные в вашем приложении, имеют свойство IsBackground, равное true. Нефонические потоки легко заблокируют приложение от выхода.
Ответ 6
Убедитесь, что у вас нет Console.ReadLine(); в вашем приложении и Environment.Exit(1); будет работать и закрывать ваше приложение.
Ответ 7
Выполняется ли это приложение (в методе Main
) с помощью Application.Run()
? В противном случае Application.Exit()
не будет работать.
Если вы написали свой собственный метод Main
и хотите остановить приложение, вы можете остановить его только путем возврата из метода Main
(или уничтожения процесса).
Ответ 8
Попробуйте следующее:
в файле Program.cs:
после Application.Run(новая форма());
добавить Application.Exit();