Ответ 1
Процесс не завершается, поскольку он все еще имеет потоки переднего плана.
Если вы создаете потоки в своем приложении, вам нужно отметить их как фоновый поток или убедиться, что они завершатся, когда вы хотите, чтобы приложение выходило.
У меня есть приложение, которое импортирует данные из Excel. Однако, когда я запускаю приложение winforms, и я запускаю приложение, используя System.Windows.Forms.Application.Exit();
, я все еще вижу "MyAppName".vshost32.exe, запущенный в диспетчере задач.
Когда я выхожу из приложения в режиме отладки, форма закрывается, но VS IDE не останавливается.
Как обеспечить правильное завершение работы приложения.
Процесс не завершается, поскольку он все еще имеет потоки переднего плана.
Если вы создаете потоки в своем приложении, вам нужно отметить их как фоновый поток или убедиться, что они завершатся, когда вы хотите, чтобы приложение выходило.
Ваш вызов Application.Exit()
работает нормально. Исполняемый файл MyAppName.vshost32.exe
является хостом для целей отладки. Он запускается, пока у вас есть проект, открытый в Visual Studio, независимо от того, есть ли активный сеанс отладки.
Обновление: Хорошо, я неправильно понял. Вышеизложенное верно, но у вас, вероятно, проблемы с зависавшими потоками в фоновом режиме. Вам нужно закрыть свои потоки, чтобы закрыть его. Ашер отвечает на это. Если вы просто пытаетесь сделать супер-взломанное быстрое и грязное убийство, вы можете использовать следующее (хотя я не беру на себя ответственность за побочные эффекты, так как это очень хаки):
System.Diagnostics.Process.GetCurrentProcess().Kill();
Вы пробовали более жестокую функцию Environment.Exit()
?
Application.Exit()
просто отправляет сообщение о завершении; если сообщение никогда не обрабатывается (по какой-либо причине), приложение будет работать неопределенно долго.
Из документации MSDN Application.Exit()
:
Метод Exit останавливает все запущенные петли сообщений во всех потоках и закрывает все окна приложения. Этот метод не обязательно заставляет приложение выйти. Метод Exit обычно вызывается из цикла сообщений и принудительно возвращает Run.
У меня была аналогичная проблема, вызванная сторонним инструментом, который не позволял мне устанавливать потоки в качестве фона. Полином имел правильную идею, но тогда синтаксис выглядит так:
System.Diagnostics.Process.GetCurrentProcess().Kill();