2012-06-27 5 views
0

Я не уверен, как правильно назвать вопрос. Пожалуйста, не стесняйтесь редактировать.триггер цикл 12 часов

У меня есть консольное приложение на моем сервере. Приложение консоли отправляет электронные письма и время от времени делает небольшие вещи (каждые 5 минут).

Приложение не запускается каждые 5 минут через диспетчер задач, оно открывается один раз в процессе установки, а бесконечный цикл и thread.sleep поддерживают его. Из-за этого я не могу настроить диспетчер задач для открытия приложения с использованием определенного параметра.

Теперь мне нужно добавить задачу для запуска каждые 12 часов, и я хочу использовать одно и то же приложение. Задача состоит в удалении и создании нескольких файлов, но проверьте, есть ли 12 часов с момента последнего создания на основе даты файла каждые 5 минут для меня немного неразумно.

Есть ли дорогой способ (нет базы данных, нет журнала, даты создания файла, нет многопоточной), чтобы отметить 12-часовую петлю с использованием того же приложения, которое у меня есть? Если нет, каков наилучший способ сделать это?

+3

Вы можете посмотреть на http://quartznet.sourceforge.net/ – Blorgbeard

+0

Или вы могли бы просто вспомнить последний раз, когда вы бежали, и проверка если это было 12 часов назад каждый раз, когда ваши 5-минутные задания настраиваются. – Blorgbeard

+0

Считаете ли вы его запуском как услугу? Я знаю, что он не отвечает на ваш вопрос - вариант для оригинального вопроса - создайте два потока - каждый со своим собственным объектом-таймером - и установите таймеры для каждой задачи. Если все сделано правильно - вы всегда можете перейти на третий/четвертый позже. Просто будьте осторожны при использовании общих ресурсов между двумя потоками. – tsells

ответ

1

Вот эффективное средство планирования в полночь по Гринвичу без зацикливания:

var now=DateTime.UtcNow; 
var today=now.Date; 
var tomorrow=today.AddDays(1); 
var dueTime=tomorrow-now; 

System.Threading.Timer timer = null; 
timer = new Timer(_ => { 
    try 
    { 
     //do your thing 
    } 
    finally 
    { 
     timer.Dispose(); 
    } 
},null,dueTime,TimeSpan.FromMilliseconds(-1d)) 
1

Как я понимаю, у вас уже есть цикл, который ждет 5 минут, а затем делает задачу A. Теперь вы хотите добавить задачу B, которая будет запускаться каждые 12 часов. Я бы либо заменил оба объектами Timer, либо каждые 5 минут, когда запускает задачу A, проверьте, сколько времени прошло с момента запуска задачи B. Если его не менее 12 часов, затем запустить задачу B. Что-то вдоль линий

if (last12HourRun.Subtract(DateTime.Now).TotalHours > 12) 
    // run task B 
    last12HourRun = DateTime.Now; 
Смежные вопросы