Почему Application.Exit не работает? - PullRequest
26 голосов
/ 16 февраля 2009

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

Я отладил эту проблему, и каким-то образом приложение запускается сразу после вызова Application.Exit. Я работаю в режиме отладки, и это актуально из-за небольшого объема кода, который зависит от определяемой переменной RELEASE. Вот код выхода моего приложения. Я проследил код, и он вошел в метод ExitApp и продолжает работать, возвращая управление вызывающей стороне и в конечном итоге вылетая.

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

    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.

Ответы [ 8 ]

44 голосов
/ 16 февраля 2009

Это статья, которая расширяет ту же цепочку мыслей, через которую вы проходите: 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);
}
7 голосов
/ 15 ноября 2011

Недавно столкнувшись с этой проблемой (из-за того, что Application.Exit не смог правильно завершить работу насосов сообщений для win-форм с помощью Application.Run (new Form ())), я обнаружил, что если вы создаете новые потоки или запускаете фоновые рабочие в конструктор, это предотвратит запуск Application.Exit.

Переместите все вызовы RunWorkerAsync из конструктора в форму. Метод загрузки:

public Form()
{
  this.Worker.RunWorkerAsync();
}

Перейти к:

public void Form_Load(object sender, EventArgs e)
{
  this.Worker.RunWorkerAsync();
}
6 голосов
/ 16 февраля 2009

Попробуйте Environment.Exit(exitCode).

3 голосов
/ 23 октября 2010

Я пошел, хотя эта ситуация во многих случаях я использую Thread.CurrentThread.Abort ()

и процесс закрыт. Кажется, что Application.Exit не соединяется с текущим потоком должным образом.

2 голосов
/ 05 января 2011

Убедитесь, что у вас нет Console.ReadLine (); в вашем приложении и Environment.Exit (1); сработает и закроет ваше приложение.

2 голосов
/ 23 октября 2010

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

0 голосов
/ 09 ноября 2014

Попробуйте это:

в файле Program.cs:

после Application.Run (новая форма ());

добавить Application.Exit ();

0 голосов
/ 16 февраля 2009

Запускается ли это приложение (в методе Main) с использованием Application.Run()? В противном случае Application.Exit() не будет работать.

Если вы написали собственный метод Main и хотите остановить приложение, вы можете остановить его, только вернувшись из метода Main (или убив процесс).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...