К сожалению, нет события, которое вы могли бы обработать, когда бы ни был остановлен процесс.
Вы можете подумать о том, чтобы убить процесс как отключение питания компьютера - независимо от того, какой код вы используете. предназначены для запуска при выключении системы, если компьютер не завершает работу корректно или корректно, этот код не будет выполняться.
Когда вы завершаете процесс с помощью диспетчера задач, он вызывает функцию Win32 TerminateProcess
, которая безоговорочно заставляет процесс (включая все принадлежащие ему потоки) завершиться. Выполнение всех потоков / процессов прекращается, а все ожидающие запросы ввода-вывода отменяются. Ваша программа фактически мертва. Функция TerminateProcess
не вызывает последовательность выключения, предоставляемую CLR, поэтому ваше управляемое приложение даже не будет знать, что оно закрывается.
Вы предлагаете беспокоиться об удалении объектов всякий раз, когда завершается процесс вашего приложения, но здесь есть несколько моментов, на которые стоит обратить внимание:
Всегда старайтесь свести к минимуму количество урона, которое можно нанести. Утилизируйте ваши объекты как можно раньше, когда вы закончите с ними. Не ждите до позже. В любой момент, когда процесс вашей программы завершается, вы должны хранить только минимальное количество объектов вокруг, что оставит меньше возможностей для утечек.
Операционная система обычно очищает и освобождает большинство этих ресурсов (т. Е. Дескрипторы и т. Д.) После завершения.
Наконец, само собой разумеется, что завершение процесса таким образом является действительно исключительным условием - даже если утечка некоторых ресурсов, это ожидаемо . Вы не должны закрывать приложение таким образом, как если бы вы убивали необходимые системные процессы Windows (даже если это возможно при работе от имени администратора).
Если вы регулярно закрываете консольное приложение, вам нужно найти другой план .