Иногда приложение не может выйти, когда я позвонил Application.Shutdown, пользовательский интерфейс был закрыт, но процесс все еще запущен. как закрыть приложение с закрытием всех потоков? Environment.Exit() может закрыть все темы? или мы должны назвать Win32 API TerminateThread, чтобы сделать это?В чем разница между Environment.Exit() и Application.Shutdown()?
ответ
Environment.Exit() - более жестокий способ закрыть приложение. Да, но в целом, если вам нужно, чтобы ваше приложение убило ваше приложение, чтобы закрыть его, я думаю, что вы рассматриваете проблему не так. Вы должны изучить, почему другие нити не закрываются грациозно?
Вы можете посмотреть в основной форме и закрыть все ресурсы, которые могут повредить приложение, не позволяя ему закрыться.
Вот как я нашел ресурсы, зависающие приложением.
- В режиме отладки включить показ threads (Это позволит вам увидеть все темы, ваше приложение работает)
- Закройте приложение таким образом, что она не закрывает правильно.
- Press pause in in Visual studio
- Просмотрите список тем и нажмите на них, чтобы увидеть, где он находится в коде, где они висят, теперь, когда вы можете видеть, какие ресурсы блокируют ваше приложение от закрытия, перейдите к событию FormClosing и закрыть/Утилизировать их там.
- Повторите до тех пор пока приложение закрывается правильно :)
Имейте в виду, что список нитей в режиме отладки покажет некоторые темы, которые работают, но не под вашим контролем, эти нити rarly имеют имя и при нажатии на кнопку их вы получите сообщение о том, что у вас нет символов. Они могут быть безопасно проигнорированы.
Одна из причин того, что ваше приложение закрывается грациозно, заключается в том, что если некоторые ресурсы (скажем, FileStream) не выполняются, поэтому использование некоторого api, чтобы заставить его быстро, может сделать все виды «случайные» проблемы возникают, например, файлы настроек/данных не записываются и так далее.
- Вы должны НИКОГДА НЕ вызов TerminateThread
- Убедитесь, что все нити, которые вы грибницы знак в качестве фона, таким образом, когда вы закрыть приложение не будет ждать их завершения.
О, здорово. Я не знал, что ты сможешь сделать 2. – Joel
IsBackground решил эту проблему для меня. Очень полезно, удивлено, что это не широко известно. – SouthShoreAK
Как сказал Шей, НИКОГДА не называйте TerminateThread, TerminateThread убивает только один поток, не позволяя ему очищаться после себя, это может привести к взаимоблокировкам и искажениям в других потоках процесса.
TerminateProcess с другой стороны убьет весь процесс и позволит ОС очистить, это самый быстрый способ закрыть процесс - вам просто нужно убедиться, что вы не держите никаких ресурсов, которые ОС не может очистить (он также помогает закрыть окна перед вызовом TerminateProcess).
Я думаю, но я не проверял, что Environemnt.Exit вызывает TerminateProcess.
Application.Shutdown очень отличается, он не сразу убивает процесс - он отправляет все уведомления о закрытии и завершении работы и ждет, чтобы все окна и потоки приложения закрылись.
- 1. разница между Environment.Exit и простого возврата 2 из главного
- 2. В чем разница между «и»?
- 3. В чем разница между `{}` и `[]`?
- 4. В чем разница между == и ===?
- 5. В чем разница между «+» и «\ +»?
- 6. В чем разница между + = и = +?
- 7. В чем разница между/* ... */и/** ... */
- 8. В чем разница между: и +:
- 9. В чем разница между $ {} и # {}
- 10. В чем разница между $ _. и $ _
- 11. В чем разница между = и: =
- 12. В чем разница между && и &?
- 13. В чем разница между $ {} и # {}?
- 14. В чем разница между + и%?
- 15. В чем разница между + = и = +
- 16. В чем разница между # {} $ {} и% {}?
- 17. В чем разница между «» и «»?
- 18. В чем разница между ['#'] и [. = '#']?
- 19. В чем разница между == ~ и! =?
- 20. В чем разница между «/» и «/ *»?
- 21. В чем разница между «./» и «../»?
- 22. В чем разница между {}()) и {})()
- 23. В чем разница между «'» и «»
- 24. В чем разница между «и«
- 25. В чем разница между (&& и &) и (|| и |)?
- 26. В чем разница между ....?
- 27. В чем разница между:
- 28. чем разница между [[], []] и [[]] * 2
- 29. чем разница между * и Object
- 30. В чем разница между работой. и^и^(. *) $?
спасибо за ваш ответ, называемый «Application.Shutdown», но процесс все еще работает не всегда, я пробовал свой путь, чтобы выяснить, какой поток работает, но эта ошибка не была переделана ... –