GC.KeepAlive()和System.Timers.Timer

use*_*185 2 c# garbage-collection

System.Timers.Timer在类级别中对declered 对象进行了创建并在构造函数中创建.在另一个方法中启动了计时器.

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

我正在为每个层级获得过去的事件.问题是在经过一段时间后停止了.

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

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

GC.KeepAlive(timer)我应该在我的项目中宣布哪里?

Jim*_*hel 5

如果计时器是在类级别声明的,则GC不会自动收集它,因为它不会超出范围.并设置Enabledfalse不会导致您描述的行为.你的问题出在其他地方.

我怀疑你的事件处理程序中有异常.System.Timers.Timer吞下事件处理程序中发生的异常,这意味着如果异常转义事件处理程序,您将永远不会知道它.

我怀疑你的代码写得与此类似:

myTimer.Enabled = false;
// do stuff here
myTimer.Enabled = true;
Run Code Online (Sandbox Code Playgroud)

如果在"在这里做事"期间抛出异常,则异常会逃避处理程序,计时器永远不会重新启用,并且计时器代码会吞下异常,因此您永远不会知道发生了什么.

您应该像这样编写事件处理程序:

myTimer.Enabled = false;
try
{
    // do stuff here
}
catch (Exception ex)
{
    // handle exceptions
}
finally
{
    myTimer.Enabled = true;
}
Run Code Online (Sandbox Code Playgroud)

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