Приложение не закрывается, когда главное окно закрыто - PullRequest
2 голосов
/ 04 февраля 2010

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

В конце концов я обнаружил, что если вы создадите экземпляр Window любого типа, даже если вы никогда не вызовете Show () или ShowDialog (), когда вы закроете свое приложение, оно не прекратит работу.Поэтому теперь я должен вызывать Close (), когда это уместно, и проблема никогда не возвращалась со всеми созданными мной Windows.

Я реализовал больше новых функций, которые несоздавать окна (насколько я могу судить!), но теперь мое приложение не прекратит работу снова .Я думаю, что нажатие паузы в VS IDE бесполезно, поскольку потоки не имеют никакого контекста, поэтому я не могу понять, какой код вызвал зависание.

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

Может кто-нибудь порекомендовать хороший инструмент (бесплатный или лицензионный)требуется) что поможет мне быстро решить такие глупые проблемы?Сейчас я собираюсь вернуться, закомментировать тонну нового кода, а затем раскомментировать построчно, пока проблема не появится снова.Грубая сила - это то, как я обычно в конечном итоге исправляю подобные вещи, и буду очень признателен за инструмент, который облегчит мою жизнь.:)

Ответы [ 4 ]

3 голосов
/ 04 февраля 2010

Похоже, у вас могут быть другие проблемы с фоновыми потоками, на которые обращаются другие ответы, но в отношении WPF Windows, вы пытались изменить ShutdownMode вашего класса App? Вы также можете попробовать принудительно закрыть приложение, явно вызвав функцию Shutdown:

Application.Current.Shutdown();
2 голосов
/ 04 февраля 2010

Вы можете получить больше информации, если подключитесь, используя как управляемый, так и неуправляемый код. В Visual Studio 2008 вы можете изменить режим в форме «Присоединить к процессу». Нажмите кнопку «Выбрать ...» и укажите отладку для «Управляемого» и «Собственного».

(Прежде чем сделать это, убедитесь, что путь к символам настроен. Перейдите в Инструменты / Параметры, Отладка, Символы. Введите http://msdl.microsoft.com/download/symbols в списке расположений файлов символов. Кэшируйте символы локально в некотором каталоге. )

Когда вы подключаетесь в управляемом и неуправляемом режимах, вы должны получить больший стек вызовов. Я рекомендую щелкнуть правой кнопкой мыши в окне отладки Call Stack и выбрать «Включить вызовы в / из других потоков».

Если ваш основной поток показывает System.Windows.Forms.Application.Run или ThreadContext.RunMessageLoop, то насос сообщений вашего потока пользовательского интерфейса активен и продолжает отправлять сообщения. Если по какой-то причине он переходит в другой поток, он не может выйти, пока не завершится.

Вы также можете увидеть полные трассировки стека остальных управляемых и неуправляемых потоков. Возможно, вы захотите найти поток сборщика мусора и посмотреть, что он делает. Ищите тот, у которого есть стек с "GCHeap :: FinalizerThreadStart" в нем. Это может что-то делать.

Может также существовать поток GID +, который пытается выполнить работу.

1 голос
/ 04 февраля 2010

Я не хочу слишком упрощать вещи, но вы пытались установить владельца диалогового окна в MainWindow? Это заставит диалоговое окно закрыться при закрытии MainWindow. Другими словами, это будет выглядеть так:

dialog.Owner = Window.GetWindow(this);
// Or...
dialog.Owner = Application.Current.MainWindow;

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

0 голосов
/ 04 февраля 2010

Хотя это может не помочь в вашем конкретном случае, Process Explorer - отличный инструмент для просмотра внутренних процессов и определения количества потоков и т. Д.

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