我有显示新表单对话框的示例代码:
private void button1_Click(object sender, EventArgs e)
{
(new Form2()).ShowDialog(this);
GC.Collect();
}
如果表单有按钮,面板标签等,则执行此form2的Dispose方法,但如果我添加toolStrip,则不执行Dispose方法 . 为什么在这些情况下执行Dispose?
如果表格是由ShowDialog显示然后我应该执行Dispose方法,但是为什么它有时会在没有它的情况下工作?
编辑:可以在ShowDialog之后添加Collect方法 . 此方法仅用于测试并且多次执行 .
要检查是否执行了Dispose方法,我添加了断点(在调试模式下) . 当然,程序结束时会执行使用ToolStrip的示例处理 .
好的,我知道如何正确实现它,因为我感兴趣为什么GC无法清理,如果在表单上是toolStrip?
显示它的最简单的代码是:示例1 - 结果 - 100,示例2 - 结果> 0(GC可以清理),示例3 - 始终为0.为什么示例2和3有所不同?
private class Form2 : Form
{
public static int disposed = 0;
byte[] data;
private System.Windows.Forms.ToolStrip toolStrip11;
public Form2(bool addToolStrip)
{
data = new byte[100000];
this.Shown += (sender, e) => { this.Close(); };
this.Controls.Add(new Button());
if (addToolStrip)
{
this.toolStrip11 = new System.Windows.Forms.ToolStrip();
this.Controls.Add(this.toolStrip11);
}
}
protected override void Dispose(bool disposing)
{
++disposed;
base.Dispose(disposing);
}
}
private void ShowResult()
{
GC.Collect(); GC.Collect();
GC.WaitForFullGCComplete();
MessageBox.Show(Form2.disposed.ToString());
Form2.disposed = 0;
}
private void button1_Click(object sender, EventArgs e)
{
//proper
for (int i = 0; i < 100; ++i)
{
using(Form2 f = new Form2(true))
{
f.ShowDialog();
}
}
ShowResult();
//ok GC can clean - why yes ?
for (int i = 0; i < 100; ++i)
{
Form2 f = new Form2(false);
f.ShowDialog();
}
ShowResult();
//GC can't clean - why not ?
for (int i = 0; i < 100;a ++i)
{
Form2 f = new Form2(true);
f.ShowDialog();
}
ShowResult();
}