C# - Как создать «охраняющий процесс» для программы и убедиться, что он всегда запущен? - PullRequest
0 голосов
/ 05 мая 2020

Я создал программу, которая считывает задачи (отправляет электронное письмо / отправляет sms et c) из базы данных и выполняет каждую задачу в указанное c время. Программа работает и выполняет все поставленные задачи. Я использую обработку ошибок, но хочу принять дополнительные меры предосторожности, чтобы, если программа выйдет из строя по какой-либо причине, она уведомит меня и автоматически перезапустит программу и выполнит задачи, которые не были выполнены из-за cra sh. Программа работает на windows.

Изменить: я объясню больше о том, как работает программа. Программа постоянно считывает данные из таблицы sql и добавляет в список напоминания, отвечающие этим параметрам: IsExecuted = False и DateTimeStart находится в пределах 1 минуты от DateTime.Now. Как только я закончил читать таблицу и добавил соответствующие напоминания в список. Я выполняю все напоминания (асинхронно) -> удаляю их из списка -> и меняю IsExecuted = True в таблице sql, чтобы он больше не добавлял его. Как только я sh отправляю все напоминания, я повторяю этот процесс бесконечно.

Как лучше всего достичь этой цели? Как мне создать службу / программу, которая не только перезапускает основную программу, но и проверяет, какие напоминания должны были выполняться, но не выполнялись?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Скорее всего, самый простой способ «самостоятельно разместить» консольное приложение - это поместить его в службу Windows . Он может быть автоматически перезапущен при сбое службы. Вы должны проверить это обсуждение SO для получения дополнительных сведений об этом.


Есть еще одна вещь, которую следует учитывать. Насколько я понимаю, рабочий процесс ваших приложений можно описать так:
1) Считывает необработанные данные
2 / A) Обрабатывать считанные данные
2 / B) Пометить данные как обработанные

I ' Мы использовали A и B, чтобы указать, что они выполняются одновременно . Но с этим есть проблема: то, что происходит, либо 2 / A, либо 2 / B терпят неудачу.

  • Если 2 / A завершается неудачно, но 2 / B завершается успешно, то задание не выполнено, но сообщается как успешное (повторная попытка не инициируется)
  • Если 2 / B терпит неудачу, но 2 / A выполнено успешно, тогда задание выполнено, но об успешном выполнении не сообщается (поэтому будет выполнено повторное выполнение)

Немного лучше будет использовать semanti c блокировку введя состояния ProcessStarted и ProcessFinished. Имея это в виду, рабочий процесс будет выглядеть следующим образом:

1) Прочитать необработанные данные и пометить их как ProcessStarted
2) Данные процесса
3) Отметить обработанные данные как ProcessFinished

При таком подходе вы можете легко определить, какие данные были начаты для обработки, но не завершились sh, путем запроса тех, у которых состояние ProcessStarted и дата последнего изменения больше, чем предопределенный порог.

Следует отметить еще одну вещь: в случае пакетной обработки вы должны иметь возможность повторить попытку всего пакета, а не только отдельных данных.

0 голосов
/ 05 мая 2020

Вы можете установить вашу программу как службу . Затем вы можете настроить параметры восстановления вручную или с помощью PowerShell .

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

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