gpt4 book ai didi

c# - GC.KeepAlive() 和 System.Timers.Timer

转载 作者:行者123 更新时间:2023-12-02 05:14:04 24 4
gpt4 key购买 nike

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

在经过的事件处理程序中,enabled 属性设置为 false 并执行一些代码,然后再次 enabled 设置为 true。

我正在获取每次间隔的经过事件。问题是经过一段时间后停止。

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

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

我应该在我的项目中的什么地方声明GC.KeepAlive(timer)

最佳答案

如果计时器在类级别声明,则它不会被 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;
}

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

关于c# - GC.KeepAlive() 和 System.Timers.Timer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14937643/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com