В чем разница между Environment.Exit () и Application.Shutdown ()? - PullRequest
20 голосов
/ 25 мая 2009

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

Ответы [ 3 ]

19 голосов
/ 25 мая 2009

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

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

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

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

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

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

9 голосов
/ 25 мая 2009
  1. Вы должны НИКОГДА не звонить Завершение темы
  2. Убедитесь, что все потоки, которые вы создали, помечены как фоновые, поэтому при закрытии приложения оно не будет ждать их завершения.
2 голосов
/ 25 мая 2009

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

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

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

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

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