Csharp/C#教程:动态System.Timers.Timer和垃圾收集?分享


动态System.Timers.Timer和垃圾收集?

假设我动态创建一个这样的计时器:

System.Timers.Timer expirationTimer = new Timer(expiration * 60000); expirationTimer.Elapsed += (sender, e) => removeExpiredCacheEntry(sessionID); expirationTimer.Start(); 

当该引用超出范围时,Timer对象是否会被垃圾回收? 如果是这样,活动还会开火吗? 如果没有,那么在这种情况下如何避免内存泄漏?

谢谢!

根据这个答案 ,计时器对象确实有资格进行垃圾收集,并且在某些时候停止触发事件。

但是,反过来防止垃圾收集。 如果我们有

 publisher.SomeEvent += target.SomeHandler; 

然后“发布者”将保持“目标”活着,但“目标”不会让“发布者”保持活力。

一旦对象超出范围,就没有对它的额外引用。 它最终将被垃圾收集。 但这可能不会发生一段时间。 因此,计时器可能会继续发射,直到它最终被垃圾收集。

这只是一个猜测,因为我目前没有能力测试它。

更新:

我刚写了一个看起来像这样的小测试程序:

 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秒的睡眠,然后调用GC.Collect()并且即使在强制垃圾收集之后计时器仍然保持运行,尽管无法保证调用GC.Collect()实际上会做任何事情。

我还尝试将计时器包装在using语句中,并且正确地立即禁用了计时器(没有在屏幕上打印任何内容)。 所以,我相信我的假设是正确的,垃圾收集最终将收集计时器,并处理它。 但是没有办法确定何时会这样。

上述就是C#学习教程:动态System.Timers.Timer和垃圾收集?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/957636.html

(0)
上一篇 2021年11月21日
下一篇 2021年11月21日

精彩推荐