2010-04-10 5 views
1

У меня есть служба 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 класса таймера. Почему? :-)

ответ

2

На самом деле проблема заключается в том, что я выбрал неправильный класс таймера.

С System.Threading.Timer у меня есть те вопросы, которые я объяснил в своем первоначальном вопросе.

Когда я перешел на System.Timers.Timer, все эти проблемы исчезли.

Так что это все еще задает вопрос: почему на земле есть как минимум три разных класса Timer в .NET framework и каковы (тонкие) различия между ними?

0

Возможно, это связано с конвейером сообщений.

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

1

Это не очевидно, если посмотреть на код выше, что вы получаете несколько таймеров. но, на мой взгляд, это может быть так. потому что System.Threading.Timer реализует IDisposable, поэтому вместо обнуления переменной вы должны вызвать метод dispose.

MSDN говорит ...

Когда таймер больше не требуется, используйте метод Dispose освободить ресурсов, проводимых с помощью таймера.

Смежные вопросы