1

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

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();
    }
}

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

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

4

2 回答 2

5

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

 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);

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

于 2012-06-14T18:02:25.797 回答
0

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

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

于 2012-06-14T18:05:36.570 回答