我有一个简单的表单(MainForm),它打开另一个表单(SubForm),上面有一个ToolStrip。
被叫表格上没有其他内容。调用表单只有一个按钮。
由于SystemEvents.UserPreferenceChanged有一个事件处理程序,因此永远不会回收被调用的表单的内存。我读到这是一个在.NET 3.5.1中得到修复的问题。
[编辑该应用程序在3.5.1上运行,因此它不是真正修复的,或者我做了不同的事情)
我可以做一些事情,以便GC可以回收子表格的内存吗?
一旦删除ToolStrip,表单子表单就可以再次进行垃圾回收。
MainForm
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
SubForm subForm = new SubForm();
subForm.ShowDialog();
}
}
SubForm
public partial class SubForm : Form
{
public SubForm()
{
InitializeComponent();
}
}
使用Toolstrip的实例保留图
答案 0 :(得分:1)
您正在显示一个对话框,但从不处理它,因此至少将它放在using()子句中,或者在适当的时候进行处理。详细了解ShowDialog here
答案 1 :(得分:1)
放入SubForm
的终结器并向控制台写一些内容,以查看表单是否被销毁。有点像...
~SubForm()
{
Console.WriteLine("Destroyed!");
}
然后在创建表单的代码中,在ShowDialog
返回后,包含GC.Collect()
进行垃圾回收。当你运行程序时,如果你看到控制台消息,那么一切都很好。如果不这样做,则可能是ToolStrip内存泄漏导致的内存泄漏。
如果是这种情况,请在SubForm的Dispose()
事件中的ToolStrip上调用FormClosed
,然后重试。这适用于我使用.Net 2,这有问题。如果再次运行,则应获取控制台消息。如果不这样做,您可能会有另一个内存泄漏(例如DateTimePicker
)