是否有可能多次调用此函数时:
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/