2011-12-14 5 views
16

У меня есть приложение, которое импортирует данные из Excel. Однако, когда я запускаю приложение winforms, и я запускаю приложение, используя System.Windows.Forms.Application.Exit();, я все еще вижу «MyAppName» .vshost32.exe, работающий в диспетчере задач.Выход из приложения winforms C#

Когда я выхожу из приложения в режиме отладки, форма закрывается, но VS IDE не останавливается.

Как обеспечить правильное завершение работы приложения.

+0

Подобный вопрос http://stackoverflow.com/questions/4314436/i-cant-kill-myapp-vshost-exe – dash

ответ

16

Процесс не заканчивается, поскольку он по-прежнему имеет foreground threads running.

Если вы создаете потоки в своем приложении, вам нужны потоки mark them as background или убедитесь, что они завершатся, когда вы хотите, чтобы приложение выходило.

+0

+1, не думал об этом – Cameron

21

Ваш звонок Application.Exit() работает нормально. Исполняемый файл MyAppName.vshost32.exe является хостом для целей отладки. Он работает, пока у вас есть проект, открытый в Visual Studio, независимо от того, есть ли активный сеанс отладки.

Обновление: Хорошо, я неправильно понял. Вышеизложенное верно, но у вас, вероятно, проблемы с зависавшими потоками в фоновом режиме. Вам нужно закрыть свои потоки, чтобы закрыть его. Ответ Ашера охватывает это. Если вы просто пытаетесь сделать супер-Hacky быстрого и грязным убить, вы можете использовать следующий (хотя я не несу никакой ответственности за побочные эффекты, так как это очень Hacky):

System.Diagnostics.Process.GetCurrentProcess().Kill();

+1

Я согласен в целом , за исключением того, что в этом конкретном сценарии сеанс отладчика VS по-прежнему продолжается, указывая, что приложение все еще работает (по крайней мере, так я интерпретировал вопрос) – Cameron

+0

@Cameron - Ах, я неправильно понял. Я обновлю. – Polynomial

+0

Nice catch @Cameron – Troy

6

Есть вы пробовали более жестокую функцию Environment.Exit()?

Application.Exit() просто отправляет сообщение, говорящее об отключении; если сообщение никогда не обрабатывается (по какой-либо причине), приложение будет работать бесконечно.

От MSDN documentation of Application.Exit():

Метод Выхода останавливает все запущенное сообщение петли на все потоки и закрывает все окна приложения. Этот метод не обязательно заставляет приложение выйти. Метод Exit обычно вызывается из цикла сообщений и принудительно запускает Run.

+0

Ну, форма выходит, и когда я делаю точку останова, я ударяю эту строку, и она выполняется отлично. Так что эта строка выполняется. – Troy

+0

@Troy: Правильно, но вызов 'Application.Exit()' просто отправляет сообщение в очередь всех сообщений; насос вашей формы, кажется, обрабатывает сообщение и выходит, но есть что-то еще (другой поток, может быть?), который не учитывает запрос – Cameron

4

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

System.Diagnostics.Process.GetCurrentProcess().Kill(); 
Смежные вопросы