我正在开发一个需要在不同时期完成多项任务的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);
计时器似乎继续正确启动。
答案 0 :(得分:2)
从GC.KeepAlive上的文档中,我会说您可能想要检查它是否正在按照您的想法进行操作。垃圾收集器只能保证在方法的开始和调用KeepAlive之间保持对象的活动。你能让这些成员留在身边吗?
答案 1 :(得分:0)
您应该将Timer
个实例存储在字段中。
调用GC.KeepAlive
不会无限期地保持对象生效。
答案 2 :(得分:0)
就垃圾收集而言,如果计时器对象都是静态类字段,那么它们的当前实例将不会被垃圾收集,除非您稍后将字段设置为null或新对象,因此GC.KeepAlive是不必要的(无论如何它都没有帮助它被使用)。在OnStart中调用此代码的位置在哪里?