Почему 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();