Winform 工具提示内存泄漏。来自 timer_tick 的自处置控制

Arc*_*ald 1 c# memory-leaks winforms

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

void Func(String spr, PictureBox pictureBox)
{
    ToolTip toolTip = new ToolTip();
    toolTip.Show(spr, pictureBox, 1000);
}
Run Code Online (Sandbox Code Playgroud)

会发生内存泄漏吗?

功能完成后工具提示是否仍然有可能只是超出范围并自行处理?

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

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

    private void timer_Tick(object sender, EventArgs e)
    {
        this.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Me.*_*ame 5

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

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

     toolTip.Show(spr, pictureBox, 1000);
 }
Run Code Online (Sandbox Code Playgroud)

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

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

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