Использование System.Timers.Timer в asp.net

Я использую следующий код на веб-сайте asp.net.

В приложении init я вызываю InitializeTimer() один раз.

Целью кода было запустить DoWork() один раз в час (1 раз в час).

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

Результат, который я получил, был werid, я не могу найти объяснение, почему происходит.

Код выполнил функцию через 2 часа, затем снова через 2 часа, затем после 3 часа, затем через 2 часа и 2 часа снова. ****

Кто-нибудь может объяснить причину?

using System.Timers;
....
private static random = new Random();
....
public static void InitializeTimer()
{
    tTimer = new Timer();
    tTimer.AutoReset = true;
    tTimer.Interval = TimeSpan.FromHours(1.0).TotalMilliseconds;
    tTimer.Elapsed += new ElapsedEventHandler(ClassName1.tMailer_Elapsed);
    tTimer.Start();
}

private static void tTimer_Elapsed(object sender, ElapsedEventArgs e)
{
    tTimer.Interval += random.Next(-5, 5);

    DoWork();
}

Update:

  • Пожалуйста, не публикуйте "использовать службу Windows" или "запланированную задачу". Мой вопрос заключается в следующем коде. Я не ищу лучших альтернатив. Кроме того, во время этого теста (10 часов) веб-сайт был с высоким трафиком, iis-пул не перезагрузился!

  • На основе следующего MSDN: (http://msdn.microsoft.com/en-us/library/system.timers.timer.interval.aspx)

Если интервал установлен после таймера, счетчик reset. Для Например, если вы установите интервал в 5 секунд, а затем установите значение Включено свойство true, счет начинается с устанавливается время Enabled. Если вы resetинтервал до 10 секунд, когда счетчик составляет 3 секунды, событие Истекшее поднят в первый раз 13 секунд после того, как Enabled установлено в значение true.

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

Считая, что когда функция tTimer_Elapsed называется счетчиком, это 1 час (мин. несколько миллисекунд) и мой код "tTimer.Interval + = random.Next(-5, 5);" добавляет еще один полный час к интервалу?

Ответ 1

Отметьте этот из... Джефф Этвуд фактически обсудил что-то подобное. Я думаю, это сработало, но, по словам Джеффа, сайт перерос этот метод, поэтому они пошли на задание.

Ответ 2

Приложения ASP.NET будут закрыты, если они не используются. Если кто-то попадает на ваш сайт, а затем больше нет хитов, он может быть закрыт. Ваш таймер не срабатывает.

Для этого типа работ по обслуживанию вы хотите использовать запланированную задачу Windows или службу Windows.

Ответ 3

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

Ответ 4

Так как .net 4.5.2, существует класс под названием HostingEnvironment, он может делать то, что вы просите, вот как использовать: https://blog.mariusschulz.com/2014/05/07/scheduling-background-jobs-from-an-asp-net-application-in-net-4-5-2

Метод HostingEnvironment.QueueBackgroundWorkItem позволяет вам график небольших работ фона. ASP.NET отслеживает эти элементы и не позволяет IIS резко прекратить рабочий процесс до тех пор, пока все фоновые рабочие элементы завершены.