Как правильно установить запланированную задачу в веб-приложении

#c# #.net #asp.net #quartz.net

#c# #.net #asp.net #quartz.net

Вопрос:

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

Я использую Spring.Quartz для решения этой проблемы. Но теперь этот материал выполняется в службе Windows (которая взаимодействует с базой данных веб-сайта).
Мне было интересно, невозможно ли использовать библиотеку Quartz в веб-приложении.
Я знаю, что это работает, пока приложение активно, но что, если приложение повторяет цикл? Или неактивен в течение некоторого времени (например, 2 дня).

Редактировать: Возможно регулярное бездействие. Но уведомления все равно должны работать.

Существуют ли другие методы для этого? Любая помощь приветствуется.

Приветствия

Комментарии:

1. Идеально сохранить ее в качестве службы Windows. Почему вы хотите внедрить такую функциональность в веб-приложение? Предполагается, что они обрабатывают запросы пользователей, а не задачи периода выполнения.

2. Это может быть легко, но это плохая практика. Хорошо иметь сайт и службу в разных доменах, поскольку они функционально отличаются.

Ответ №1:

В этом случае лучше всего использовать подход службы Windows. Вы также можете создать расписание Windows, которое будет вызывать вашу страницу (например, http:// [your-site] / [yourapp] /notifyusers.aspx), которая будет делать то, что необходимо. Или, если вы ожидаете, что приложение будет посещаться довольно часто (чтобы вы были уверены, что оно не просто перерабатывается), поместите в Application_Start из global.asax элемент QueueWorkingItem для запуска потока, который будет иметь что-то вроде приведенного ниже:

 private void MyPingThread(object state)
{
    ThreadExitState lstate = state as ThreadExitState;
    EventWaitHandle handle = new EventWaitHandle(false, EventResetMode.ManualReset);
    while (true)
    {
        if (lstate != null)
        {
           if (!lstate.Active)
               return;
        }
        handle.WaitOne(1000 * 60 * 60 * 4); // Run the task each 4 hours
        //Do your work here
    }
}
  

Ответ №2:

Просто запустите поток при запуске приложения (вы можете использовать глобальный.asax). Оберните это в while (true) и try / catch, убедитесь, что у вас есть несколько приятных длительных перерывов в работе, даже если возникают ошибки (т. Е. за пределами блока try / catch), и все готово. Возможно, это не подходит, если вам нужно уведомление с точностью до секунды, но оно должно работать для того, что вы делаете.

Комментарии:

1. Это не сработает, поскольку домен приложения будет переработан как минимум через 29 часов, и, если после этого не произойдет никаких действий, приложение не будет работать. Конечно, если приложение посещается хотя бы пару раз в день, этот подход будет работать.

Ответ №3:

Обычно я создаю новый проект «Библиотека классов» и добавляю его в свое решение.
Затем я создаю новую задачу в планировщике задач.

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