Глобальный таймер в Asp.net

Я хотел бы иметь таймер для приложения ASP.net, которое будет запускаться каждое воскресенье вечером и что-то выполнять (обновлять таблицу в базе данных). Тем не менее, я действительно не хочу писать службу, которая должна быть развернута на сервере в дополнение к веб-приложению. Есть ли способ сделать это легко? Возможно, используя файл Global.asax?

+7
источник поделиться
6 ответов

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

+9
источник

Я не уверен на 100%, где бы вы его выразили, но используя System.Threading.Timer будет качать это.

// In some constructor or method that runs when the app starts.
// 1st parameter is the callback to be run every iteration.
// 2nd parameter is optional parameters for the callback.
// 3rd parameter is telling the timer when to start.
// 4th parameter is telling the timer how often to run.
System.Threading.Timer timer = new System.Threading.Timer(new TimerCallback(TimerElapsed), null, new Timespan(0), new Timespan(24, 0, 0));

// The callback, no inside the method used above.
// This will run every 24 hours.
private void TimerElapsed(object o)
{
    // Do stuff.
}

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

Но, как говорили другие, используйте что-то, кроме сайта, для этого. Легко сделать службу Windows, чтобы справиться с этим.

+4
источник

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

+3
источник

Попробуйте Quartz.NET, планировщик заданий для .NET-приложений .NET, таких как ASP.NET, и это должно служить вашей цели.

+1
источник

Я не думаю, что приложение .NET является хорошим решением вашей проблемы.

IIS Recycling будет перерабатывать процесс каждые несколько часов (в зависимости от настройки), и даже если вы установите этот интервал на семь дней, пул приложений все равно может быть переработан по другим причинам, не зависящим от вас.

Я согласен с jcrs3: Просто напишите небольшое консольное приложение и используйте планировщик. Вы также можете написать услугу, но если вам нужно что-то быстрое и простое, зайдите в консольное приложение.

0
источник

В ответ на ваш комментарий о запланированных задачах:

Другим взломом было бы переопределить событие в Global.asax, даже такое, которое часто называется Application_EndRequest() и делает что-то похожее на:

protected void Application_EndRequest()
{
    if (((DateTime)Application["lastTimeRun"]) < DateTime.Today)
    {
        Application["lastTimeRun"] = DateTime.Today;
        doSomething();
    }
}

Это будет работать после первого запроса после изменения даты, поэтому вам не будет гарантировано, что это будет выполняться точно в 3 часа ночи каждое утро.

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

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос