У меня есть служба Windows NT на C#, которая в основном просыпается каждые x секунд, проверяет, нужно ли отправлять уведомления по почте, а затем снова возвращается спать.Таймер в службе Windows - не работает?
Это выглядит как это (Timer
класс от System.Threading
имен):
public partial class MyService : ServiceBase
{
private Timer _timer;
private int _timeIntervalBetweenRuns = 10000;
public MyService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
// when NT Service starts - create timer to wake up every 10 seconds
_timer = new Timer(OnTimer, null, _timeIntervalBetweenRuns, Timeout.Infinite);
}
protected override void OnStop()
{
// on stop - stop timer by freeing it
_timer = null;
}
private void OnTimer(object state)
{
// when the timer fires, e.g. when 10 seconds are over
// stop the timer from firing again by freeing it
_timer = null;
// check for mail and sent out notifications, if required - works just fine
MailHandler handler = new MailHandler();
handler.CheckAndSendMail();
// once done, re-enable the timer by creating it from scratch
_timer = new Timer(OnTimer, null, _timeIntervalBetweenRuns, _timeIntervalBetweenRuns);
}
}
Отправка почты и все работает просто отлично, и служба также просыпается каждые 10 секунд (в действительности, это это параметр из конфигурационного файла, упрощенный для этого примера).
Однако иногда, служба кажется просыпаться слишком быстро ....
2010-04-09 22:50:16.390
2010-04-09 22:50:26.460
2010-04-09 22:50:36.483
2010-04-09 22:50:46.500
2010-04-09 22:50:46.537 ** why again after just 37 milliseconds...... ??
2010-04-09 22:50:56.507
отлично работает до 22: 50: 45.500 - почему это войти еще одну запись всего 37 миллисекунд позже ??
Здесь, мне кажется, что это совершенно не в порядке .... похоже, просыпаются два или даже три раза, каждый раз 10 секунд закончились ....
2010-04-09 22:51:16.527
2010-04-09 22:51:26.537
2010-04-09 22:51:26.537
2010-04-09 22:51:36.543
2010-04-09 22:51:36.543
2010-04-09 22:51:46.553
2010-04-09 22:51:46.553
2010-04-09 22:51:56.577
2010-04-09 22:51:56.577
2010-04-09 22:52:06.590
2010-04-09 22:52:06.590
2010-04-09 22:52:06.600
2010-04-09 22:52:06.600
Любые идеи, почему ?? Это не огромная проблема, но я обеспокоен тем, что может начать загружать слишком много нагрузки на сервер, если интервал, который я настраиваю (10 секунд, 30 секунд - независимо), кажется, игнорируется все больше и больше, чем дольше работает сервис ,
Я пропустил что-то очень важное в моем сервисном коде ?? Я в конечном итоге с несколькими таймерами, или что-то ?? Кажется, я не могу понять это ... я выбрал неправильный таймер (System.Threading.Timer
)? В .NET есть как минимум 3 класса таймера. Почему? :-)