2

System.Timers.Timer在类级别中删除了对象并在构造函数中创建。在另一种方法中启动了计时器。

在经过的事件处理程序中启用属性设置为假并执行一些代码并再次启用设置为真。

我收到每个间隔的已过事件。问题是经过一段时间后停止。

我怀疑计时器对象是由 GC 在经过的事件处理程序 eventhadler 中的 moment enabled 属性设置为 false 时收集的。

所以我希望我的计时器对象设置为保持活动状态。

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

4

1 回答 1

5

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

我怀疑您的事件处理程序中存在异常。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;
}

您通常只想捕获特定的异常——那些您知道如何处理的异常。像上面这样捕获所有异常通常是不好的做法。

于 2013-02-18T13:52:20.467 回答