GC.KeepAlive()和System.Timers.Timer

时间:2013-02-18 13:37:37

标签: c# garbage-collection

我在类级别中声明了System.Timers.Timer对象,并在构造函数中创建。在另一个方法中启动了计时器。

在elapsed事件处理程序启用属性设置为false并执行某些代码并再次启用设置为true。

我正在为每个intervel获取已过时的事件。 问题是在一段时间后停止了。

我怀疑GC在已经过时的事件hanler eventhadler中将momment enabled属性设置为false时收集了计时器对象。

所以我希望我的计时器对象设置为活着。

我应该在我的项目中哪里声明GC.KeepAlive(timer)

1 个答案:

答案 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;
}

您通常希望捕获特定的异常 - 您知道如何处理的异常。抓住上述所有异常通常是不好的做法。