gpt4 book ai didi

c# - 扩展方法中的 Lambdas : Possible memory leak?

转载 作者:太空狗 更新时间:2023-10-29 21:15:30 26 4
gpt4 key购买 nike

我刚刚回答了一个 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 .我也是 found a way通过使用 WeakReference s 如果我的对象还活着。

更新2

睡了一觉,想了想之后,我还对我的测试仪 (answer below) 进行了另一项更改,我只是在最后一行之后添加了一个 GC.Collect() 并设置了持续时间到 10000。在启动 BlinkText() 几次后,我一直点击我的 button2 以获取当前状态并强制进行垃圾回收。似乎所有计时器都将在调用 Stop() 方法后 被销毁。因此,在我的 BlinkText 已经离开并且计时器正在运行时进行垃圾回收也不会导致任何问题。

所以在你们的良好回应和更多测试之后,我可以很高兴地说它只是做了它应该做的事情,没有将计时器留在内存中,也没有在完成工作之前丢弃计时器。

最佳答案

你的假设是正确的。 timer 将在调用方法时分配,并在最后符合垃圾回收条件。

lamba 事件处理程序(假设它没有在其他地方被引用)也将有资格进行垃圾收集。

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

关于c# - 扩展方法中的 Lambdas : Possible memory leak?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2584009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com