我在类级别中声明了System.Timers.Timer
对象,并在构造函数中创建。在另一个方法中启动了计时器。
在elapsed事件处理程序启用属性设置为false并执行某些代码并再次启用设置为true。
我正在为每个intervel获取已过时的事件。 问题是在一段时间后停止了。
我怀疑GC在已经过时的事件hanler eventhadler中将momment enabled属性设置为false时收集了计时器对象。
所以我希望我的计时器对象设置为活着。
我应该在我的项目中哪里声明GC.KeepAlive(timer)
?
答案 0 :(得分:5)
如果计时器是在类级别声明的,则GC不会自动收集它,因为它不会超出范围。将Enabled
设置为false
不会导致您描述的行为。你的问题在别的地方。
我怀疑你的事件处理程序有异常。 System.Timers.Timer
吞下事件处理程序中发生的异常,这意味着如果异常转义事件处理程序,您将永远不会知道它。
我怀疑你的代码写得与此类似:
myTimer.Enabled = false;
// do stuff here
myTimer.Enabled = true;
如果在“在这里做事”期间抛出异常,则异常会转义处理程序,计时器永远不会重新启用,并且计时器代码会吞下异常,因此您永远不会知道发生了什么。
您应该像这样编写事件处理程序:
myTimer.Enabled = false;
try
{
// do stuff here
}
catch (Exception ex)
{
// handle exceptions
}
finally
{
myTimer.Enabled = true;
}
您通常希望捕获特定的异常 - 您知道如何处理的异常。抓住上述所有异常通常是不好的做法。