C # Windows Service - несколько таймеров - PullRequest
3 голосов
/ 19 июля 2010

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

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

 fullTimer = new System.Timers.Timer();
 fullTimer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
 fullTimer.Interval = Convert.ToDouble(interval * 1000);
 fullTimer.AutoReset = true;
 fullTimer.Start(); // or fullTimer.Enabled = true;
 GC.KeepAlive(fullTimer);

   stockTimer = new System.Timers.Timer();
   stockTimer.Elapsed += new ElapsedEventHandler(StockOnElapsedTime);
   stockTimer.Interval = Convert.ToDouble(stockInterval * 1000);
   stockTimer.AutoReset = true;
   stockTimer.Start();
   GC.KeepAlive(stockTimer);

Может кто-нибудь понять, почему таймеры не будут срабатывать. Я получаю действительно странное поведение. Если я запускаю обработчик запасов вручную

StockOnElapsedTime(null,null);

Таймер продолжает работать правильно.

Ответы [ 3 ]

2 голосов
/ 19 июля 2010

Из документов по GC.KeepAlive я бы сказал, что вы можете проверить, что он делает то, что, как вы думаете, он делает.Сборщик мусора гарантирует, что объекты будут поддерживаться только между началом метода и до того момента, когда будет вызван KeepAlive.Можете ли вы сделать из этих членов объект, который останется рядом?

0 голосов
/ 19 июля 2010

Что касается сбора мусора, если объекты таймера оба являются полями статического класса, то их текущие экземпляры не будут собираться мусором, если позже вы не установите для полей значение null или новый объект, поэтому GC.KeepAlive не требуется (и это не помогло бы, где бы оно ни использовалось). Где этот код вызывается в OnStart?

0 голосов
/ 19 июля 2010

Вы должны хранить экземпляры Timer в полях.

Вызов GC.KeepAlive не будет поддерживать жизнь объекта неограниченно долго.

...