这是将Lambda用作EventHandler的有效方法吗?在我看来,处理程序已被正确删除,垃圾收集器应该清理它。但是,我没有看到其他人这样做,所以我想我最好仔细检查一下。
同样,使用什么最好的工具(最好是免费的)来测试这是否实际上是垃圾收集?
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(10);
EventHandler callback = null;
callback = (s, e) =>
{
timer.Stop();
timer.Tick -= callback;
};
timer.Tick += callback;
timer.Start();
答案 0 :(得分:4)
DispatcherTimer由Dispatcher类保持活动状态,它在内部保留List<DispatcherTimer>
,用于存储对已启用的任何计时器的引用。一旦你停止()计时器,对象就会从该列表中删除,如果你不存储任何额外的引用,它就有资格进行垃圾收集。在这种情况下,您不知道,计时器参考是一个局部变量。
您无法在实现lambda的自动生成的类上获得终结器。接下来最好的事情就是简单地运行这个代码十亿次。如果你没有失去成员消费和OOM,那么它显然不会泄漏。你想让间隔更短,所以它要到圣诞节才能用,15毫秒是好的。使用计时器调用方法,这样您就不会同时获得太多活动计时器,并允许调度员完成其工作。
答案 1 :(得分:3)
是的,在回调执行一次后,回调将有资格进行垃圾回收。这是订阅事件以便仅执行一次处理程序的合理方式。
很难证明委托将被垃圾收集 - 或者确实用于保存捕获的变量callback
和timer
的对象将被垃圾收集,诚然...你真的想在那里放一个终结器(当然会影响垃圾收集本身),但你不能生成代码。