какая разница между Environment.Exit () и Application.Shutdown ()?

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

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

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

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

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

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

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

  1. Вы никогда не должны называть TerminateThread
  2. Убедитесь, что все streamи, которые вы создавали, отмечены как фон, таким образом, когда вы закрываете приложение, оно не будет ждать их завершения.

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

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

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

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

  • Вызов функции для каждого вариационного аргумента шаблона и массива
  • C #: Разница между '+ = anEvent' и '+ = new EventHandler (anEvent)'
  • Внедрение единого входа ASP.NET ASP.NET
  • C # Linq to SQL: Как выразить «CONVERT ( AS INT)»?
  • Что делает метод streamобезопасным? Каковы правила?
  • Что не так с использованием Thread.Abort ()
  • Что такое «промежуток», и когда я должен использовать его?
  • Элемент массива обновления Mongo (драйвер .NET 2.0)
  • Может ли Console.Clear использоваться только для очистки строки вместо всей консоли?
  • Проверка на нуль до отправки события ... streamобезопасная?
  • Когда выделены векторы, они используют память в куче или стеке?
  • Давайте будем гением компьютера.