2009-05-25 5 views
16

Иногда приложение не может выйти, когда я позвонил Application.Shutdown, пользовательский интерфейс был закрыт, но процесс все еще запущен. как закрыть приложение с закрытием всех потоков? Environment.Exit() может закрыть все темы? или мы должны назвать Win32 API TerminateThread, чтобы сделать это?В чем разница между Environment.Exit() и Application.Shutdown()?

ответ

17

Environment.Exit() - более жестокий способ закрыть приложение. Да, но в целом, если вам нужно, чтобы ваше приложение убило ваше приложение, чтобы закрыть его, я думаю, что вы рассматриваете проблему не так. Вы должны изучить, почему другие нити не закрываются грациозно?

Вы можете посмотреть в основной форме и закрыть все ресурсы, которые могут повредить приложение, не позволяя ему закрыться.

Вот как я нашел ресурсы, зависающие приложением.

  1. В режиме отладки включить показ threads (Это позволит вам увидеть все темы, ваше приложение работает)
  2. Закройте приложение таким образом, что она не закрывает правильно.
  3. Press pause in in Visual studio
  4. Просмотрите список тем и нажмите на них, чтобы увидеть, где он находится в коде, где они висят, теперь, когда вы можете видеть, какие ресурсы блокируют ваше приложение от закрытия, перейдите к событию FormClosing и закрыть/Утилизировать их там.
  5. Повторите до тех пор пока приложение закрывается правильно :)

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

Одна из причин того, что ваше приложение закрывается грациозно, заключается в том, что если некоторые ресурсы (скажем, FileStream) не выполняются, поэтому использование некоторого api, чтобы заставить его быстро, может сделать все виды «случайные» проблемы возникают, например, файлы настроек/данных не записываются и так далее.

+0

спасибо за ваш ответ, называемый «Application.Shutdown», но процесс все еще работает не всегда, я пробовал свой путь, чтобы выяснить, какой поток работает, но эта ошибка не была переделана ... –

8
  1. Вы должны НИКОГДА НЕ вызов TerminateThread
  2. Убедитесь, что все нити, которые вы грибницы знак в качестве фона, таким образом, когда вы закрыть приложение не будет ждать их завершения.
+0

О, здорово. Я не знал, что ты сможешь сделать 2. – Joel

+1

IsBackground решил эту проблему для меня. Очень полезно, удивлено, что это не широко известно. – SouthShoreAK

1

Как сказал Шей, НИКОГДА не называйте TerminateThread, TerminateThread убивает только один поток, не позволяя ему очищаться после себя, это может привести к взаимоблокировкам и искажениям в других потоках процесса.

TerminateProcess с другой стороны убьет весь процесс и позволит ОС очистить, это самый быстрый способ закрыть процесс - вам просто нужно убедиться, что вы не держите никаких ресурсов, которые ОС не может очистить (он также помогает закрыть окна перед вызовом TerminateProcess).

Я думаю, но я не проверял, что Environemnt.Exit вызывает TerminateProcess.

Application.Shutdown очень отличается, он не сразу убивает процесс - он отправляет все уведомления о закрытии и завершении работы и ждет, чтобы все окна и потоки приложения закрылись.

Смежные вопросы