Процесс заканчивается после остановки всех потоков переднего плана.
В типичном приложении Winforms есть один основной поток переднего плана - поток пользовательского интерфейса.Это останавливается после закрытия основной формы (используемой в Application.Run
).Проверьте, что ваш метод Main
делает впоследствии, или просто установите точку останова, чтобы увидеть, успешно ли работает поток
. Возможно, у вас также есть некоторый рабочий поток переднего плана, если вы выполняете многопоточность.Это ваша ответственность, чтобы убедиться, что они все остановлены.Сложность в том, что некоторые из используемых вами классов могут раскручивать такие потоки самостоятельно, без вашего ведома.Первое, что нужно иметь в виду, это то, что любой объект, который вы создаете, который реализует IDisposable
, должен быть фактически удален.Это может решить проблему.Одним из примеров, который часто вызывает проблемы, является System.Threading.Timer
(или System.Timers.Timer
) - если вы этого не сделаете, Dispose
, ваше приложение будет работать неопределенно долго.
Чтобы исследовать проблему, вы можете использоватьсписок потоков в отладчике Visual Studio (Debug -> Windows -> Threads).Запустите приложение, подождите столько, сколько потребуется, закройте форму и затем приостановите отладчик.Список потоков покажет все управляемые потоки в процессе.Посмотрите на расположение запущенных потоков - двойной щелчок по потоку переключит ваше представление отладчика на этот поток, и вы сможете увидеть стек вызовов.Это может дать вам некоторое представление о том, откуда появился этот поток и какой код он выполняет в данный момент (т.е. почему он застрял).Вы, вероятно, где-то увидите ожидание (если только он не выполняет работу процессора);просто посмотрите на стек вызовов (Debug -> Windows -> Call Stack) и поищите что-нибудь для идентификации.
Если вы проверили все потоки и не видите ничего подозрительного в стеках вызовов, вывозможно, придется сделать немного конфигурации в отладчике.Есть две основные вещи, которые вы можете попробовать - во-первых, в окне стека вызовов щелкните правой кнопкой мыши и выберите «Показать внешний код».Если это не поможет, вам, возможно, придется отключить Just My Code (Параметры -> Отладчик) и включить загрузку символов для задействованных модулей.Это немного сложнее.