Управляемое базой данных приложение «запланированные задачи» в C # - нужен некоторый совет по поводу синтаксиса - PullRequest
2 голосов
/ 28 сентября 2010

Для рабочего проекта я выполняю задачу, которая позволит мне создать C # .NET Windows Service, который будет работать 24/7.Программа будет по существу просто перемещать файлы (на основе заданного пути и регулярного выражения) между различными местами - из / в HTTP, Network Paths и FTP.Администратор запланирует эти задания через страницу администрирования в ASP.NET, где все задания будут храниться в базе данных.Кажется, самая сложная часть - это планирование этих заданий - очень просто запланировать выполнение задач в определенный день в определенное время, но оно также должно быть достаточно устойчивым, чтобы задачи могли выполняться каждый день, каждый день недели, каждый определенный день.месяца или даже каждые несколько секунд / минут.Я пришел к выводу, что самым простым способом хранения этой информации о планировании было бы использование синтаксиса cron (http://adminschoice.com/crontab-quick-reference) в базе данных.

) Приложение имеет таймер для проверки базы данных на предмет изменений каждые 10 минут, но основнойУ меня есть проблема с извлечением задач, которые необходимо выполнить - я думаю, что один из вариантов - просто извлекать все каждые 10 минут и проверять каждую отдельную строку, чтобы увидеть, должны ли они быть выполнены. Но я чувствую, что это очень неэффективнои технически ленивый путь - как бы вы, ребята, пошли по этому поводу?

Я знаю, что запланированные задачи Windows были бы намного проще, но, похоже, мой босс этого не хочет.

Спасибозаранее всем, кто может дать несколько советов / советов.

Ответы [ 2 ]

0 голосов
/ 28 сентября 2010

Взгляните на Quartz.NET - почти все, что вы хотите.Вы можете запланировать это, используя Cron выражений .

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

Размещение этого в службе Windows - хороший способ сделать это - позволяет отслеживать его работу и предоставляет стандартные механизмы для его перезапуска в случае падения.(net start xxx) и т. д. Гораздо лучше, чем запланированные задания.

0 голосов
/ 28 сентября 2010

Если количество задач, которые вы должны отслеживать, невелико, вы можете сохранить приоритетную очередь всех задач в памяти.Узлы будут содержать ключ записи (из базы данных) и вычисленную дату / время следующего обновления.

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

Тем не менее, я согласен с @Oded: убедить вашего босса использовать WindowsЗапланированные задачи.Если ему не нравится этот интерфейс, вы можете попросить ваше веб-приложение (или службу, с которой взаимодействует веб-приложение) общаться с API планировщика задач Windows.Codeplex имеет упаковщик: http://taskscheduler.codeplex.com/

...