【发布时间】:2020-05-28 03:30:20
【问题描述】:
如果我创建一个不与 Form.Designer.cs 文件关联的 System.Windows.Forms.Timer(例如,我只是在我的代码中的任何位置实例化计时器),然后我创建一个 System.ComponentModel.Container 组件并创建一个要添加到它的控件,例如 NotifyIcon(此 notifyIcon 不会有与之关联的图标)并将该 notifyIcon 添加到我的组件对象然后实例化 forms.timer 与组件作为计时器构造函数的参数,将如果计时器的启用属性在程序的生命周期内设置为 false 并且计时器在程序的生命周期内从未被丢弃,那么计时器是否会被 GC-ed?或者只要不直接处理该组件,计时器就不会被垃圾回收吗?
这是一个代码示例:
NotifyIcon notifyIcon = new NotifyIcon();
notifyIcon.Visible = false;
System.ComponentModel.IContainer components = new System.ComponentModel.Container();
components.add(notifyIcon);
System.Windows.Forms.Timer formTimer = new System.Windows.Forms.Timer(components);
formTimer.Enabled = true;
formTimer.Enabled = false;
感谢阅读
【问题讨论】:
-
为什么不保留对计时器的引用?
-
把它存储在一些私有字段中——GC收集没有引用的对象,它不关心这个对象是启用还是禁用
-
启用与什么有什么关系?是否有参考或目前是否在范围内才是最重要的。
-
Or as long as that component is not disposed of directly, would the timer be safe from garbage collection?否。定时器在无法访问时将有资格被 GC。 -
whether it is currently in scope@shox 并不重要(它可以看起来在调试时很重要 - 但实际上并不重要)。重要的是是否有对它的实时引用(即可达)。 docs.microsoft.com/en-us/archive/blogs/cbrumme/…
标签: c# winforms timer garbage-collection