c# – 扩展方法中的Lambdas:可能的内存泄漏?

c# – 扩展方法中的Lambdas:可能的内存泄漏?,第1张

概述我刚刚使用扩展方法给出了 quite simple question的答案.但在写完之后我记得你不能从事件处理程序取消订阅lambda. 到目前为止没有大问题.但是这一切如何在扩展方法中表现出来? 下面是我的代码再次剪断.所以任何人都可以启发我,如果你多次调用这个扩展方法会导致无数的计时器在内存中徘徊? 我会说不,因为定时器的范围在这个函数内是有限的.所以在离开后没有其他人有这个对象的引用.我只是 我刚刚使用扩展方法给出了 quite simple question的答案.但在写完之后我记得你不能从事件处理程序取消订阅lambda.

到目前为止没有大问题.但是这一切如何在扩展方法中表现出来?

下面是我的代码再次剪断.所以任何人都可以启发我,如果你多次调用这个扩展方法会导致无数的计时器在内存中徘徊?

我会说不,因为定时器的范围在这个函数内是有限的.所以在离开后没有其他人有这个对象的引用.我只是有点不确定,因为我们在静态类中的静态函数中.

public static class LabelExtensions{    public static Label BlinkText(this Label label,int duration)    {        System.windows.Forms.Timer timer = new System.windows.Forms.Timer();        timer.Interval = duration;        timer.Tick += (sender,e) =>            {                timer.Stop();                label.Font = new Font(label.Font,label.Font.Style ^ FontStyle.Bold);            };        label.Font = new Font(label.Font,label.Font.Style | FontStyle.Bold);        timer.Start();        return label;    }}

更新

只是为了澄清我使用过System.Windows.Forms.Timer.所以从你的答案看来,特别是使用这个计时器类只是正确的选择因为它做了任何事情,就像我在这种情况下所期望的那样.如果你在这种情况下尝试另一个计时器类,你可能会遇到麻烦Matthew found out.
如果我的物品还活着,我也可以使用WeakReferences来found a way.

更新2

经过一点点的睡眠和更多的思考后,我还对我的测试仪进行了另一次更改(answer below)我在最后一行之后添加了一个GC.Collect()并将持续时间设置为10000.在启动BlinkText()几次之后我我一直按下按钮2来获取当前状态并强制进行垃圾收集.并且因为看起来所有的计时器都会在调用Stop()方法后被销毁.因此,当我的BlinkText已经离开并且计时器正在运行时,垃圾收集也不会导致任何问题.

因此,经过你所有的良好反应和更多的测试后,我可以高兴地说,它只是做了它应该做的事情而不会将计时器留在记忆中,也不会在计时器完成工作之前扔掉它们.

解决方法 你的假设是正确的.调用方法时将分配计时器,并且最终可以进行垃圾收集.

lamba事件处理程序(假设它未在别处引用)也有资格进行垃圾回收.

这是静态方法和/或扩展方法的事实不会改变对象可达性的基本规则.

总结

以上是内存溢出为你收集整理的c# – 扩展方法中的Lambdas:可能的内存泄漏?全部内容,希望文章能够帮你解决c# – 扩展方法中的Lambdas:可能的内存泄漏?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1262963.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存