Winform 工具提示内存泄漏.自我处置 timer_tick控制

本文关键字:timer tick 控制 工具提示 内存 泄漏 自我 Winform | 更新日期: 2023-09-27 18:37:18

多次调用此函数时,是否有可能:

void Func(String spr, PictureBox pictureBox)
{
    ToolTip toolTip = new ToolTip();
    toolTip.Show(spr, pictureBox, 1000);
}

会发生内存泄漏吗?

功能完成后的工具提示仍然存在,甚至有可能它只是超出范围并自行处理?

如果第一个问题的答案是"是",那么创建我自己的工具提示是自我处置的timer_tick是一个很好的解决方案吗?

public partial class MyToolTip : ToolTip
{
    public MyToolTip()
    {
        InitializeComponent();
        timer.Interval = this.AutomaticDelay;
    }
    private void timer_Tick(object sender, EventArgs e)
    {
        this.Dispose();
    }
}

如果在这种情况下没有必要,它是否适用于已知物体寿命时间的其他情况,或者它只是糟糕的设计?

我之所以选择此解决方案,是因为我希望能够同时显示许多工具提示。

Winform 工具提示内存泄漏.自我处置 timer_tick控制

在执行方法后,ToolTip对象仍将存在于内存中,并且每次调用该方法时都会创建一个新的ToolTip实例。最好重用现有的ToolTip。例如

 ToolTip toolTip = new ToolTip();
 void Func(String spr, PictureBox pictureBox)
 {
     toolTip.Show(spr, pictureBox, 1000);
 }

edit 对于多个工具提示并在不需要自定义对象的情况下显式释放(在 GC 外部),您可以尝试一些东西(有点笨拙;)),例如:

 var toolTip= new ToolTip();
 toolTip.Show(spr, pictureBox);
 new System.Threading.Timer(o => tt.Dispose(), null, 1000, System.Threading.Timeout.Infinite);

以上方法将起作用,不过,也许重用计时器会更好。

垃圾回收器最终会在必要时清除工具提示使用的内存,因此没有理由担心释放它。

不过,最好使用单个 ToolTip 对象,而不是在每次要显示提示时都创建新的工具提示。