c# - 当没有其他对象引用它们时,Timer 对象是否会被 GC-ed?

标签 c# garbage-collection timer

如果没有其他对象引用包含事件计时器 (System.Timers.Timer) 的对象,是否可以对其进行垃圾回收?

最佳答案

有两种基本方法可以让 Timer 保持引用状态,即使您没有在某处存储引用也是如此:

  • 只要启用定时器。有一个实际生成事件的底层 System.Threading.Timer。 CLR 保留一个事件计时器列表,它们的回调委托(delegate)对象保留引用的计时器。

  • 如果 Elapsed 事件处理程序不是静态的,则由它处理。这将 Timer 实例的生命周期至少延长到包含 Elapsed 事件处理程序的类对象的生命周期。

这里没有故障模式。返回对计时器的引用的唯一可能方法是通过 Elapsed 事件处理程序的 sender 参数。如果禁用计时器,则无法再获取引用,因此适合收集对象。

如果您将 AutoReset 属性设置为 false,那么使用此 Timer 并丢失 Elapsed 事件的一种相当经典的方法是。一个非常讨厌的问题是 Elapsed 事件处理程序中引发的任何异常都在没有任何诊断的情况下被吞没。这将绕过您必须在最后重新启动计时器的调用。支持System.Threading.Timer,它没有这个问题。

关于c# - 当没有其他对象引用它们时,Timer 对象是否会被 GC-ed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4959149/

相关文章:

c# - VB/C#.net 动态添加带有Background Worker的控件项

c# - 将 UWP 应用程序中的 sqlite 数据库备份到一个驱动器

c++ - 我是否需要在 C++ 中显式删除数组以节省内存?

android - 使用 Timer 或 MediaPlayer 方法?

用户空间和共享变量中的 Linux 计时器

c# - Wpf TreeView 从上下文菜单获取项目

c# - C# 中不贪婪的正则表达式

Java ArrayList 内存问题

javascript - 如何获取 javascript 对象引用或引用计数?

python : Timer without blocking the window in Tkinter