C#Windows服务 - 多个计时器

时间:2010-07-18 23:18:06

标签: c# .net windows windows-services timer

我正在开发一个需要在不同时期完成多项任务的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 个答案:

答案 0 :(得分:2)

GC.KeepAlive上的文档中,我会说您可能想要检查它是否正在按照您的想法进行操作。垃圾收集器只能保证在方法的开始和调用KeepAlive之间保持对象的活动。你能让这些成员留在身边吗?

答案 1 :(得分:0)

您应该将Timer个实例存储在字段中。

调用GC.KeepAlive不会无限期地保持对象生效。

答案 2 :(得分:0)

就垃圾收集而言,如果计时器对象都是静态类字段,那么它们的当前实例将不会被垃圾收集,除非您稍后将字段设置为null或新对象,因此GC.KeepAlive是不必要的(无论如何它都没有帮助它被使用)。在OnStart中调用此代码的位置在哪里?