我有这种扩展方法在给定间隔后禁用计时器。是否保证GC不会破坏disableTimer变量(在此方法中是局部变量)?或者是否有理由说明为什么这段代码将在一小时内起作用。
timer.DisableAfter(1.Hours()) :
public static void DisableAfter(this Timer timer, TimeSpan timeSpan)
{
var disableTimer = new Timer(timeSpan.TotalMilliseconds)
{
AutoReset = false,
};
disableTimer.Elapsed += (sender, e) =>
{
timer.Stop();
disableTimer.Stop();
};
disableTimer.Start();
}
答案 0 :(得分:1)
没有人知道它是否会被垃圾收集,但如果你没有保留对计时器的引用,它肯定有资格收集。
请参阅这个定时器的MSDN页面,转到第一个示例源块,阅读上面的文本,显然是源块本身...它实际上是关于Timer被垃圾收集的所有内容。
http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx
答案 1 :(得分:0)
我有另一个建议。它更简单,因为它不涉及另一个计时器。 当您在Elapsed方法上注册处理程序时,使用另一个处理程序将其包装,该处理程序将保留上次定时计时的触发器。当计时器过去时,首先检查是否已经过了一个小时,如果是 - 你取消当前执行并取消计时器。
您可以通过Elapsed委托的source参数访问计时器对象。