Почему .exe отказывается останавливаться? - PullRequest
5 голосов
/ 13 января 2009

Я «унаследовал» устаревшую программу на C # / C ++, которую мне нужно отладить. В настоящее время проблема заключается в том, что .exe не остановится после закрытия программы, т. Е. Он все еще отображается в диспетчере задач.

Это проблема, потому что она не позволит мне перезапустить программу, потому что может работать только один экземпляр. Часто убивать процесс не работает; Я вынужден перезагрузиться.

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

Q: Что может привести к остановке .exe?

Ответы [ 6 ]

12 голосов
/ 13 января 2009

Дочерние потоки не будут останавливаться автоматически, если они не были специально установлены в качестве фоновых потоков (т. Е. С thread.IsBackground = true).

Редактировать: также возможно, что основной поток не завершает работу при закрытии формы (т. Е. Есть другой код, который запускается после закрытия, который не завершается).

6 голосов
/ 13 января 2009

Я считаю полезным присоединиться к запущенному процессу с помощью отладчика и нажать кнопку паузы. После этого я бы осмотрел окно Threads и посмотрел, что делает трассировка стека для каждого из выполняющихся потоков. Окно темы скрыто по умолчанию. Вот больше информации о том, как показать это и использовать это:

http://msdn.microsoft.com/en-us/library/w15yf86f.aspx

2 голосов
/ 13 января 2009

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

2 голосов
/ 13 января 2009

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

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

0 голосов
/ 13 января 2009

Форма запуска закрыта для выхода из приложения? Если это не так, вам нужно поместить Application.Exit () или Environment.Exit () в событие form.closed формы, которая закрывается последней.

0 голосов
/ 13 января 2009

На самом фундаментальном уровне где-то есть бесконечный цикл.

...