Winform Tooltip内存泄漏。从timer_tick自行处理控制

时间:2012-06-14 17:59:20

标签: c# winforms memory-leaks

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

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

会发生内存泄漏吗?

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

如果第一个问题的回答是“是”,那么创建我自己的toolTip是一个很好的解决方案吗?这是一个很好的解决方案吗?

public partial class MyToolTip : ToolTip
{
    public MyToolTip()
    {
        InitializeComponent();
        timer.Interval = this.AutomaticDelay;
    }

    private void timer_Tick(object sender, EventArgs e)
    {
        this.Dispose();
    }
}

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

我选择了这个解决方案,因为我希望能够同时显示许多工具提示。

2 个答案:

答案 0 :(得分:4)

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

 ToolTip toolTip = new ToolTip();
 void Func(String spr, PictureBox pictureBox)
 {

     toolTip.Show(spr, pictureBox, 1000);
 }

编辑对于多个工具提示并在不需要自定义对象的情况下显式处理(在GC之外),您可以尝试一些(有点hacky;)),如:

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

上述方法可行,但也许重用计时器会更好。

答案 1 :(得分:0)

垃圾收集器最终将在必要时清除ToolTip使用的内存,因此没有理由关心自己处理它。

但是,每次要显示提示时,使用单个ToolTip对象而不是创建新的工具提示要好得多。

相关问题