После закрытия программы остаётся процесс в диспетчере задач
После закрытия программы остаётся процесс в диспетчере задач.
Как определить из-за чего это происходит?
При запуске программы через F5 программа после закрытия правильно завершается.
Но после закрития при запуске Alt F5 висит в диспетчере.
1 ответ 1
CLR завершает .NET-приложение тогда, когда все его не фоновые потоки завершили работу. Поток завершает работу, когда его главная функция возвращает управление (или при вызове метода Abort). Для приложений WPF поведение основного потока определяется свойством Application.ShutdownMode, по умолчанию он завершается при закрытии всех окон.
Соответственно, методика отладки такой ситуации такова:
Убедиться, что в программе не остается невидимых окон, мешающих закрытию основного потока.
Если приложение создает (явно) дополнительные потоки, которые бесконечно работают и никогда не возвращают управление, при их запуске нужно установить свойство IsBackground = true .
Если приложение не создает дополнительных не фоновых потоков, после завершения всех своих потоков нужно приостановить выполнение программы ( Отладка — Приостановить все ) и открыть окно потоков ( Отладка — Окна — Потоки ). В данном окне можно увидеть содержимое стека для каждого потока, и на основе этого понять источник проблемы. Если проблемный поток создает код сторонней библиотеки, нужно обратиться к ее документации и выяснить, как это исправить.
Если проблемным потоком оказался «GC Finalizer Thread», нужно убедиться, что для всех IDisposable-объектов вызывается метод Dispose или его аналог (для файловых потоков, соединений с БД и т.п. нужно всегда явно освобождать ресурсы, чтобы избежать проблем с буферизацией/кэшированием).
Дело в том, что финализаторы — очень ненадежный метод освобождения ресурсов. В некоторых ситуациях они могут приводить к взаимоблокировке, если поток сборщика мусора пытается взять Lock или на объект, занятый другим потоком, выполнение которого было прервано сборкой мусора (см. например здесь описание такой ситуации для STA COM-объектов).
Вызов метода Environment.Exit позволяет принудительно завершить программу (независимо от числа активных потоков), но так делать не следует. При этом не вызываются блоки finally в выполняющемся коде, как следствие — какие-то данные могут не дойти из промежуточных буферов до их места назначения (файл, БД, . )
Примечание — потоки из ThreadPool по умолчанию являются фоновыми, о них можно не заботиться, они никогда не предотвращают завершение программы.
Руководство на основе обсуждения в недавнем вопросе «Консольное приложение не завершается», который почему-то снесли, поэтому оставляю информацию здесь.
Процесс программы висит в диспетчере задач даже после закрытия программы
Работа с Excel: его процесс висит даже после закрытия программы
Добрый Вечер! Подскажите пожалуйста, пишу программу для обработки Excel файлов но после закрытия.
Процесс программы висит в диспетчере задач даже после закрытия программы
Не понимаю почему программа остается в процессах
CreateNoKillProcess — запрет закрытия программы в диспетчере задач
Почему вот этот код не работает: #include BOOLEAN CreateNoKillProcess(WCHAR.
В диспетчере задач висит странный процесс
BF8CA43E-FE7D-4FAE-8186-ADF9BB27AFF3.exe (C:\Users\Zerriz\AppData\Local\Microsoft\Macromed\Flash.
Мои телепатические способности подсказывают, что где-то продолжает работать поток, не являющийся фоновым, что предотвращает завершение приложения.
В целом же, просить найти ошибку в приложении без предоставления кода — как-то даже неприлично.
Мои телепатические способности подсказывают, что где-то продолжает работать поток, не являющийся фоновым, что предотвращает завершение приложения.
В целом же, просить найти ошибку в приложении без предоставления кода — как-то даже неприлично.
Дело в том, что проект огномный. И потоков всего 4. и они все IsBackground = true;
Может есть еще какие нибудь варианты, причины? Может что-то можно прописать на OnClosing?
Или может какой нубубь утилитой можно посмотреть какие процессы внутри программы продолжают функционировать после закрытия программы?
Добавлено через 12 минут
Сделал таким способом:
Работает, но так эстетически не красиво. Принудительно убивать процесс.
Может есть другие альтернативные варианты? Никак не могу найти причину. D:
Запостил бы с радостью сюда код. Но тут строк больше 3-х тысяч.
Добавлено через 39 минут
up !
Удалил все потоки. ) Прога продолжает висеть в диспетчере задач. Подскажите плз варианты. если дело не в потоках, тогда в чем. Исключений никаких не возникает, потоков нет.
Добавлено через 12 минут
Приложение написано на WPF. Каким образом можно отследить что выполняется после закрытия приложения?
Добавлено через 2 часа 30 минут
Мой тебе совет(мб и не верный)
1. Построй решение(ф6 в компиляторе)
2. Закрой компилятор
3. Открой файл.ехе в папке с проектом.
4. Закрой файл.ехе
5. Открой диспетчер задач и удивись
3к строчек ето не показатель я на 1м курсе писал код в 6к строчек и ничего не хвастался. в гугл хроме тех строчек больше миллиона
Добавлено через 1 минуту
не в потоках дело.
Добавлено через 16 минут
кстати да, для удобности используй блоки
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.
Программа на WinApi висит после закрытия в Диспетчере
После запуска приложения в VS приходится останавливать даже после закрытия. Решил попробовать.
При закрытии формы не убивается процесс в диспетчере задач, а висит там
При нажатии на кнопку выполняется процедура buttonclick в которой написано close; программа.
Процесс висит после закрытия
Есть небольшой проект, который почему-то не выгружается из процессов после закрытия. Из потоков там.
Не завершаться процесс после закрытия программы
Добрый день. Возникла проблема, после закрытия программы один из процессов.
Как закрыть программу принудительно, если она зависла и не реагирует на нажатия.
Доброго времени!
В ряде случаев даже самые «стабильные» и надежные программы могут перестать отзываться на какие-либо нажатия мышки/клавиатуры (т.е. попросту зависнуть).
Для решения вопроса, можно, конечно, перезагрузить ПК/ноутбук — но далеко не всегда это удобно (часть данных в др. ПО будет сброшена и не сохранится. ) .
Логично, что лучше всего закрыть только эту конкретно-зависшую программу. Всем известное сочетание ALT+F4 — далеко не всегда решает проблему, и, собственно, поэтому набросал небольшую заметку с несколькими способами принудительной ликвидации процесса.
👉 Кстати!
Если ПК/ноутбук вообще не реагирует ни на одну из кнопок клавиатуры — то скорее всего зависла не только отдельно-взятая программа, но и в целом система.
Если так, то для перезагрузки/выключения устройства — зажмите кнопку питания (Power) на 4-5 сек. (разумеется, все несохраненные данные будут утеряны) .
Способы закрыть не отвечающую программу
👉 Первый
И так, самый очевидный и простой вариант — просто кликнуть правой кнопкой мышки по значку зависшей программы на панели задач Windows. После, во всплывшем окне достаточно будет выбрать вариант «закрыть окно» .
👉 Второй
Если зависло полно-экранное приложение и до панели задач вы просто не можете добраться, попробуйте сочетания:
- WIN, или WIN+TAB, или ALT+TAB, или ALT+Enter — чтобы свернуть окно;
- ALT+F4, или ESC, или ALT+Q — для закрытия (выхода) из программы.
Перечисленные «горячие» сочетания клавиш работают с подавляющем большинством ПО для Windows.
👉 Третий
Нажмите сочетание клавиш Ctrl+Shift+Esc (или Ctrl+Alt+Del) для вызова диспетчер задач. Далее во вкладке процессы найдите зависшую программу (процесс), кликните по ней правой кнопкой мыши и в появившемся выберите «Снять задачу» . Через 3-5 сек. программа должна быть закрыта.
Ctrl+Shift+Esc или Ctrl+Alt+Del — открыть диспетчер задач
Кстати, если рабочий стол после этого стал отображаться «как-то не так» (или вообще не видно) — перезапустите процесс «Проводник» (или «Explorer» на англ.).
👉 Четвертый
Командная строка — универсальная штука, которая может помочь и с закрытием (ликвидацией) зависших процессов (программ). Кстати, если вы наловчитесь с ее использованием — закрывать зависшие полно-экранные приложения можно будет даже в «слепую» (когда на экране ничего не отображается).
- сначала нужно открыть 👉 командную строку;
- после ввести tasklist и нажать Enter;
- на экране появится список всех процессов (следует уточнить имя процесса/программы, которую нужно закрыть);
- после ввести taskkill /IM chrome.exe /f и нажать Enter (вместо «chrome.exe» — указывается имя нужного процесса) .
Убиваем процесс через командную строку
👉 Пятый
Если вышеприведенные варианты не увенчались успехом, можно прибегнуть к утилите Process Hacker (ссылка на SourceForge). Это бесплатное ПО, которое покажет вам все запущенные процессы, их приоритеты, занимаемую память, нагрузку и пр.
Чтобы ликвидировать (закрыть) в нем любую из запущенных программ — нужно просто ее выбрать в списке, затем нажать ПКМ по ее имени и в появившемся окне выбрать «Terminate tree» (см. пример ниже 👇).
Process Hacker 2 — закрыть дерево процессов
Стоит отметить, что Process Hacker закроет сразу всё дерево процессов, связанных с этой программой (чего не делают многие др. программы. ).
Если у вас часто начала зависать какая-либо программа (еще хуже программы) — обратите внимание на:
- версию ПО (нежелательно использовать различные бета-версии). Проверьте, совместима ли версия ПО с вашей ОС;
- обновите драйвера (желательно с офиц. сайта);
- проверьте жесткий диск (если он начал «сыпаться» — подвисания будут идти постоянно);
- прогоните систему с помощью спец. «одноразовых» антивирусных продуктов;
- возможно, вашему приложению не хватает ОЗУ (посмотрите при работе ПО — сколько памяти занято в диспетчере задач).
Кроме этого, рекомендую ознакомиться с тематическими инструкциями (ссылки ниже).
1) Вылетает или зависает игра. Что делать?
2) Зависает ноутбук: что делать? Диагностика и устранение причин зависания