Как определить, когда консольное приложение остановлено запланированной задачей в C #?

#c#

#c#

Вопрос:

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

Не могли бы вы сообщить мне, есть ли какой-либо способ определить, когда приложение остановлено планировщиком?

Я уже попробовал пару вещей, например, перехватить событие CurrentDomain.ProcessExit и реализовать SetConsoleCtrlHandler , но ни один из них не сработал.

Заранее спасибо за предложения.

Комментарии:

1. Как запланированное задание завершает задачу?

2. Обычно я бы рекомендовал, чтобы планировщик задач уничтожал программу, только если вы не можете изменить код программы, которую вы запускаете — это очень грубый подход кувалды. Поскольку вы планируете изменить код этой программы, почему бы не реализовать тайм-аут внутри — тогда, когда это произойдет, нечего обнаруживать , потому что именно ваш код вызовет завершение работы.

Ответ №1:

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

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

Одно и то же консольное приложение может обнаружить, что его экземпляр уже запущен (например, завис) при запуске, и управлять процессом — убить себя. Таким образом, вся логика находится в одном месте, и вам не нужно, чтобы запланированная задача выполняла что-то необычное.

Комментарии:

1. Спасибо за ваш отзыв. Я буду искать другие варианты.

Ответ №2:

Нашел эту статью. https://devblogs.microsoft.com/oldnewthing/20040722-00/?p=38373 это объясняет, что процесс уничтожения не может быть обработан приложением. Вы должны выйти из своего консольного приложения приятным способом, а не просто убить его процесс

Комментарии:

1. Спасибо за ваш отзыв. Да, похоже, что это невозможно обнаружить в коде. Я проверю, есть ли другие способы завершения работы приложения.

2. Также рассмотрим решения, предоставленные Джеймсом Уорлдом. Это помещает логику закрытия внутри самого консольного приложения, если это невозможно, возможно, создайте отдельное приложение фоновой службы, которое могло бы проверять с интервалами, работает ли ваше консольное приложение, а если нет, то что-то делать