在查看计时器文档时我遇到了以下带有此注释的示例: 通用标签

这是否意味着C#中的GC即使有副作用也被允许垃圾收集局部变量?大概是因为以后我不再访问计时器了,GC可以更早地收集它了吗?

如果我正确理解了这一点,就不确定我是否喜欢这种优化(但后来我可能不知道))

有帮助吗?

解决方案

是的,GC可能在结束范围之前收集局部变量,后立即在最后使用变量之后。将GC.Keepalive放在方法结束时确保变量为“活跃”,直到keepalive呼叫。

c#是势在必行的语言,因此GC尚未设计用于了解副作用的任何内容。

其他提示

据我了解,GC会将它认为不再需要的任何变量或对象标记为下一个GC周期的垃圾收集候选对象。我不确定我是否了解这里的特定应用程序,但我确实知道在某些情况下,GC可能仍会在需要时标记要收集的资源(但由于编写代码的方式而没有出现)。/ p>

通常,在方法执行期间,对象或变量会在方法调用期间保持作用域,但是如果方法调用的持续时间长于GC周期之间的时间,则GC可能会将您的Timer对象视为超出范围并标记收集。添加GC.KeepAlive方法会强制GC等待该方法退出,然后再对Timer对象进行操作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top