Я использую следующий код в веб-сайте asp.net.
На приложении init я называю InitializeTimer () однажды.
Цель кода состояла в том, чтобы выполнить DoWork () один раз в час (в 1 раз в час).
Я также хотел, чтобы код выполнил на другом времени каждый цикл, таким образом, я добавил случайную часть.
Результат, который я получил, был странным, я не могу найти explaination, почему, происходит.
Код выполнил функцию после 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();
}
Обновление:
Не отправляйте "сервис окон использования" или "запланированную задачу". Мой вопрос для следующего кода, я не ищу лучшие альтернативы. Кроме того, во время этого теста (10 часов), веб-сайт был с интенсивным трафиком, iis пул не перезапускал!
На основе следующего MSDN: (http://msdn.microsoft.com/en-us/library/system.timers.timer.interval.aspx)
Если интервал установлен после того, как Таймер запустился, количество сбрасывается. Например, если Вы устанавливаете интервал на 5 секунд и затем устанавливаете свойство Enabled на истинный, количество запускается, в то время, когда Включено установлен. При сбросе интервала к 10 секундам, когда количество составляет 3 секунды, событие Elapsed генерируется впервые спустя 13 секунд, после того, как Включено имел значение true.
Действительно ли возможно, что сброс интервала в прошедшей функции является причиной проблемы?
Означание, что то, когда функция tTimer_Elapsed вызвана количество, составляет 1 час (минута некоторые миллисекунда) и мой код "таймер. Интервал + = случайный. Затем (-5, 5)"; добавляет другой целый час к Интервалу?
Проверьте это ... Джефф Этвуд действительно обсуждал нечто подобное. Я предполагаю, что это сработало, но, по словам Джеффа, сайт перерос этот метод, поэтому они перешли к специальной задаче.
Я поддерживаю предложение Sams об использовании запланированной задачи windows для перехода на страницу каждый час. Я пытался и пытался заставить свою задачу работать, и она вроде как сработала. Я перешел на запланированную задачу, и она никогда не подводила.
Я бы сказал, что тривиальные вещи, подобные этому, вероятно, оптимизированы компилятором, и вы не должны беспокоиться о них. Первый вариант наиболее удобочитаемый, поэтому вы должны использовать его.
EDIT: Добавление того, что сказано в других ответах, также есть разница в том, что при объявлении переменной в инициализаторе цикла она прекратит свое существование после завершения цикла.
-121--3221158-Для меня я думаю, что лучший и простой способ - создать временную таблицу, которая имеет все ваши связанные поля плюс дополнительное поле, которое является полем yeas/no.
, то вы будете использовать эту таблицу в качестве источника данных для непрерывной для. Для заполнения временной таблицы требуемыми данными используется функция onLoad.
Я думаю, что после этого легко сделать цикл для выбора, просто небольшой цикл, чтобы прочитать yeas/no поле из временной таблицы.
Надеюсь, это поможет
-121--2688874-ASP.NET приложения завершают работу, когда они не используются. Если кто-то попадет на ваш сайт, а потом больше не попадет, он может быть закрыт. Твой таймер не сработает.
Для этого типа работ по обслуживанию необходимо использовать запланированную задачу Windows или службу Windows.