Я бы НЕ рекомендовал # 1.
То, что я делал в прошлом для точно такого же сценария / ситуации, - это создание запланированного задания, которое выполняется раз в N секунд, запускает небольшой скрипт, который просто выполняет эти 2 вещи: # 1 проверяет флаг «IsAlreadyRunning» который читается из базы данных) # 2 Если флаг имеет значение true, то скрипт немедленно останавливает завершение работы. Если флаг имеет значение false, сценарий запускает отдельный процесс (exe) в новом потоке (который использует службу для выполнения задачи, которая может быть очень короткой или иногда очень длинной, в зависимости от количества обрабатываемых записей). Этот процесс, конечно, устанавливает и сбрасывает флаг IsAlreadyRunning, чтобы потоки не запускали перекрывающиеся действия. У меня есть сервис, который работает уже много лет с этим подходом, и у меня никогда не было проблем с ним. Мой основной процесс использует веб-сервис и кучу других вещей для выполнения некоторых тяжелых операций резервного копирования.