Мое приложение Windows Forms все еще работает как задача после закрытия - PullRequest
0 голосов
/ 26 марта 2019

Я создал приложение Windows Forms на C # с Visual Studio 2010.

Запуск и закрытие приложения выполняется успешно в течение короткого времени. Процесс не запущен в диспетчере задач. А также процесс отладки близко. Проблем не возникает.

Но если приложение работает некоторое время, программа не закрывается и продолжает работать в диспетчере задач (Я просто открываю приложение и больше ничего не делаю, просто подожду несколько часов, чтобы воспроизвести проблему). В режиме отладки я должен нажать кнопку STOP DEBUGGING, чтобы завершить процесс.

Что я могу сделать, чтобы найти основную причину?

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Процесс заканчивается после остановки всех потоков переднего плана.

В типичном приложении Winforms есть один основной поток переднего плана - поток пользовательского интерфейса.Это останавливается после закрытия основной формы (используемой в Application.Run).Проверьте, что ваш метод Main делает впоследствии, или просто установите точку останова, чтобы увидеть, успешно ли работает поток

. Возможно, у вас также есть некоторый рабочий поток переднего плана, если вы выполняете многопоточность.Это ваша ответственность, чтобы убедиться, что они все остановлены.Сложность в том, что некоторые из используемых вами классов могут раскручивать такие потоки самостоятельно, без вашего ведома.Первое, что нужно иметь в виду, это то, что любой объект, который вы создаете, который реализует IDisposable, должен быть фактически удален.Это может решить проблему.Одним из примеров, который часто вызывает проблемы, является System.Threading.Timer (или System.Timers.Timer) - если вы этого не сделаете, Dispose, ваше приложение будет работать неопределенно долго.

Чтобы исследовать проблему, вы можете использоватьсписок потоков в отладчике Visual Studio (Debug -> Windows -> Threads).Запустите приложение, подождите столько, сколько потребуется, закройте форму и затем приостановите отладчик.Список потоков покажет все управляемые потоки в процессе.Посмотрите на расположение запущенных потоков - двойной щелчок по потоку переключит ваше представление отладчика на этот поток, и вы сможете увидеть стек вызовов.Это может дать вам некоторое представление о том, откуда появился этот поток и какой код он выполняет в данный момент (т.е. почему он застрял).Вы, вероятно, где-то увидите ожидание (если только он не выполняет работу процессора);просто посмотрите на стек вызовов (Debug -> Windows -> Call Stack) и поищите что-нибудь для идентификации.

Если вы проверили все потоки и не видите ничего подозрительного в стеках вызовов, вывозможно, придется сделать немного конфигурации в отладчике.Есть две основные вещи, которые вы можете попробовать - во-первых, в окне стека вызовов щелкните правой кнопкой мыши и выберите «Показать внешний код».Если это не поможет, вам, возможно, придется отключить Just My Code (Параметры -> Отладчик) и включить загрузку символов для задействованных модулей.Это немного сложнее.

0 голосов
/ 10 июля 2019

Если ваш проект содержит более 1 формы, вам следует перейти к событиям последней формы и дважды щелкнуть событие «FormClosed».После того, как это действие отправит вам код, напишите в скобках:

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