Идея службы Windows? - PullRequest
       12

Идея службы Windows?

0 голосов
/ 23 мая 2011

Позвольте мне объяснить сценарий и то, что я пытаюсь выполнить.

Сценарий: у меня есть веб-приложение, которое собирает дату (например, 07.12.2011) и время (например, 19:45)и сохраните их в базе данных (SQL).

Что я пытаюсь сделать: В 07:45 вечера 07.12.2011 я хочу вызвать веб-службу для запуска другого задания.

Я думаю о создании службы Windows, которая запускается каждые 15 минут каждый день, собирает все «ожидающие» запросы (даты и время), ставит их в очередь и выполняет запросы в таком порядке.

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

Ответы [ 5 ]

3 голосов
/ 23 мая 2011

В прошлом, когда я делал это, я использовал Планировщик задач Windows , чтобы запустить исполняемый файл, который делает то, что я хочу.

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

1 голос
/ 23 мая 2011

Службы Windows добавляют (иногда) ненужный уровень сложности к такой проблеме.

Я бы порекомендовал начать с простого консольного приложения и использовать планировщик Windows, чтобы запускать его каждые x минут.

Если вы решите преобразовать в «реальный» сервис позднее, почти весь ваш код должен использоваться повторно.

0 голосов
/ 23 мая 2011

Я использовал и Планировщик задач Windows , и службы Windows в разных веб-проектах, оба имеют свои достоинства.

Лично я предпочитаю использовать запланированные задачи.Обычно у меня есть небольшой универсальный инструмент, вызывающий URL в основном веб-приложении.Вроде как вызов веб-службы.Вывод добавляется в файл журнала.
Преимущество этой настройки заключается в том, что при развертывании новой версии веб-приложения также обновляется служба.

Я бы порекомендовал службу Windowsтолько если вам нужно выполнять длительные задачи или задачи, требующие доступа к небезопасным ресурсам, поскольку они плохо работают с веб-приложениями.Опять же, такой же тип задач можно также выполнить с помощью инструмента командной строки.

На практике я обнаружил, что основная проблема со службами Windows заключается в том, что они работают бесконечно.В идеальном мире это не проблема.Однако в реальном мире я видел утечки памяти в службах (да, в службах на основе .NET).Со временем эти службы начнут поглощать все больше и больше ресурсов.
Запланированная задача будет запускать новый процесс для каждого вызова, ограничивая количество ущерба, которое может нанести утечка.

0 голосов
/ 23 мая 2011

Я использовал Quartz.Net с некоторым успехом.Это немного более гибко, чем вы описали.Планирование новой задачи так же просто, как:

    public static void Schedule(DateTime when, string applicationId)
    {
        ISchedulerFactory factory = new StdSchedulerFactory();
        IScheduler scheduler = factory.GetScheduler();

        JobDetail jobDetail = new JobDetail("Realization Job", null, typeof(CustomTask));
        jobDetail.JobDataMap["applicationId"] = applicationId;

        Trigger trigger = new SimpleTrigger("Custom Task Trigger", DateTime.UtcNow, null, 0, TimeSpan.Zero);
        scheduler.ScheduleJob(jobDetail, trigger);
    }

Обратите внимание, что у меня есть обертка вокруг JobScheduler, которая позволяет ей действовать как служба Windows.Создание этого в качестве службы Windows позволяет мне более надежно обрабатывать ошибки и не заставляет меня полагаться на ОС, как это делает планировщик задач.

0 голосов
/ 23 мая 2011

Перед написанием службы Windows вы можете оценить следующие решения.

http://www.firedaemon.com/ - FireDeamon предоставляет бесплатную версию для планирования заданий. http://quartznet.sourceforge.net/ - библиотека планирования с открытым исходным кодом, к которой можно обратиться, если ваша служба Windows должна поддерживать больше функций.

Если вы работаете в .NET Framework 4, эта ссылка должна пролить свет на эту проблему.

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