C# 动态系统。计时器。计时器和垃圾收集?
假设我动态创建一个计时器,如下所示:C# 动态系统。计时器。计时器和垃圾收集?,c#,.net,C#,.net,假设我动态创建一个计时器,如下所示: System.Timers.Timer expirationTimer = new Timer(expiration * 60000); expirationTimer.Elapsed += (sender, e) => removeExpiredCacheEntry(sessionID); expirationTimer.Start(); static void Main(string[] args)
System.Timers.Timer expirationTimer = new Timer(expiration * 60000);
expirationTimer.Elapsed += (sender, e) => removeExpiredCacheEntry(sessionID);
expirationTimer.Start();
static void Main(string[] args)
{
SetTimer();
Console.ReadLine();
}
private static void SetTimer()
{
Timer expirationTimer = new Timer(1000);
expirationTimer.Elapsed += (sender, e) => Notify(e);
expirationTimer.Start();
}
private static void Notify(ElapsedEventArgs e)
{
Console.WriteLine(string.Format("Notified! {0}", e.SignalTime));
}
当该引用超出范围时,计时器对象是否会被垃圾收集?如果是这样的话,事件还会继续发生吗?如果不是,那么在这种情况下我如何避免内存泄漏
谢谢 一旦对象超出范围,并且没有对它的附加引用。它最终将被垃圾收集。但这可能暂时不会发生。因此,计时器可能会一直启动,直到它最终被垃圾回收 不过这只是一个猜测,因为我目前没有能力测试它 更新: 我刚刚编写了一个小测试程序,看起来像这样:
System.Timers.Timer expirationTimer = new Timer(expiration * 60000);
expirationTimer.Elapsed += (sender, e) => removeExpiredCacheEntry(sessionID);
expirationTimer.Start();
static void Main(string[] args)
{
SetTimer();
Console.ReadLine();
}
private static void SetTimer()
{
Timer expirationTimer = new Timer(1000);
expirationTimer.Elapsed += (sender, e) => Notify(e);
expirationTimer.Start();
}
private static void Notify(ElapsedEventArgs e)
{
Console.WriteLine(string.Format("Notified! {0}", e.SignalTime));
}
计时器持续启动了很长一段时间(我最终结束了程序)。有趣的是,我在main函数中插入了一个15秒的sleep,然后调用了GC.Collect()
,并且即使在强制垃圾收集之后,计时器仍然保持运行,尽管不能保证调用GC.Collect()
实际上会做任何事情
我还尝试将计时器包装在using语句中,这立即正确地禁用了计时器(没有在屏幕上打印任何内容)。所以,我相信我的假设是正确的,垃圾收集最终会收集计时器,并处理它。但是没有办法确定这将是什么时候。根据,计时器对象确实有资格进行垃圾收集,并在某个时候停止触发事件
但是,垃圾收集是以另一种方式阻止的。如果我们有
publisher.SomeEvent += target.SomeHandler;
然后“publisher”将使“target”保持活动状态,但“target”不会使“publisher”保持活动状态。谢谢!最后,我只是将计时器本身传递给事件处理程序,这样可以防止它被垃圾收集,并让我直接对其调用Dispose()。谢谢。很高兴有一个具体的答案。