c# - Winform 工具提示内存泄漏。来自 timer_tick 的自配置控制

标签 c# winforms memory-leaks

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

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

会发生内存泄漏吗?

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

如果第一个问题的答案是"is",创建我自己的工具提示(从 timer_tick 自行处理)是否是一个好的解决方案?

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

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

如果在这种情况下这不是必需的,它是否适用于已知对象生命周期的其他情况,或者仅仅是糟糕的设计?

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

最佳答案

方法执行后,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);

虽然上面的方法可行,但重用计时器可能会更好。

关于c# - Winform 工具提示内存泄漏。来自 timer_tick 的自配置控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11038742/

相关文章:

c# - 尝试删除数据库文件时出现 "file in use by another process"错误

java - 如何使这个 java 内存泄漏的 junit 测试通过?

c# - 类 VS 引用结构

javascript - 没有从 SignalR 跨域返回任何消息,但 ping 正常

c# - Delphi 7 与 C# 表达式求值

c# - 为什么 TypedReference.MakeTypedReference 如此受限?

c# - 从 .NET 3.5 切换到 4 后出错

C++/Winforms 线程 : I get a build error with _beginthread

php - 如何循环 "release"内存?

java - "Warning: Do not place Android context classes in static fields; this is a memory leak (and also breaks Instant Run)"