Почему мое приложение не закрывается при выходе из системы / завершении работы (c # /. Net winforms)? - PullRequest
2 голосов
/ 06 февраля 2009

Мое приложение winforms не закрывается, когда я выхожу / выключаюсь. У меня есть основная форма, чье событие закрытия запускается правильно, но должно быть что-то еще, удерживающее мое приложение. Если я проверяю Application.OpenForms, то есть только одна моя основная форма.

Сложность в том, в чем проблема, вероятно, заключается в том, что мое приложение использует ShellWindows для подключения к Internet Explorer и иногда открывает формы при возникновении событий IE. После того, как одна или несколько из этих форм были открыты и закрыты, мое приложение перестает закрываться при завершении работы.

Я думаю, что я очищаю все объекты формы и т. Д. И соответствующим образом вызываю FinalReleaseComObject (), но я предполагаю, что где-то есть ссылки, которые держат мой процесс открытым. Есть ли способ понять, что мешает моему приложению закрыться изящно?

Ответы [ 3 ]

3 голосов
/ 06 февраля 2009

Приложение также останется открытым, если запущены потоки, для которых не задан фоновый режим. Если вы создаете какие-либо собственные потоки, убедитесь, что они заканчиваются соответствующим образом.

Если не критично, что поток завершается, установите для IsBackground значение true. Вы также можете вызвать Abort в потоке, чтобы (несколько) принудительно уничтожить его.

1 голос
/ 06 февраля 2009

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

Во время завершения работы Windows просит каждое работающее приложение завершить работу, отправив WM_QUIT в главное окно процесса. WinForms с радостью будут использовать это сообщение для закрытия главного окна, но если какие-либо фоновые потоки останутся, сам процесс может продолжиться.

0 голосов
/ 08 февраля 2009

Это действительно уродливый способ сделать это, но если все, что вы хотите сделать, это уничтожить любой поток, который зависает, вы можете запустить все потоки в вашем приложении с помощью System.Diagnostics.Process.GetCurrentProcess.Threads и затем перечислите их и вызовите Thread.Join () или Thread.Abort () для них.

Только убедитесь, что НЕ вызываете .Abort () в основном потоке (UI), с которым вы работаете (который получает событие Closing). Поэтому убедитесь, что ваш текущий поток (System.Threading.Thread) не тот, который вы прерываете.

...