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