Mir*_*ine 13 c# forms dispose winforms
我在C#中打开和关闭表单时遇到了新问题.
我的问题是如何在关闭后处理表单.
这是我的代码:
Program.cs中:
static class Program
{
public static Timer timer;
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
timer = new Timer { Interval = 1000};
timer.Start();
Application.Run(new Form1());
}
}
Run Code Online (Sandbox Code Playgroud)
Form1.cs中:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 form = new Form2();
form.ShowDialog();
/// I've tried Dispose() method . but didn't work
}
}
Run Code Online (Sandbox Code Playgroud)
Form2.cs:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
Program.timer.Tick += timer_Tick;
Close();
// I've tried Dispose() method instead of Close() but didn't work
}
private int count = 0;
void timer_Tick(object sender, EventArgs e)
{
count++;
if (count == 5) MessageBox.Show("");
}
}
Run Code Online (Sandbox Code Playgroud)
编辑: 我的问题是:为什么在form2关闭后5秒后显示消息框!
编辑:这个问题原来是关于Dispose.
首先,Dispose注意垃圾收集.发生以下情况:
要理解的要点是,Close/Dispose只改变Form的状态,他们不会(不能)'删除'实例.所以(封闭的)形式就在那里,计数器字段仍在那里并且事件触发.
好的,第1部分:
一个using () {}块会更好,但这应该工作:
private void button1_Click(object sender, EventArgs e)
{
Form2 form = new Form2();
form.ShowDialog();
/// I've tried Dispose() method . but didn't work
form.Dispose(); // should work
}
Run Code Online (Sandbox Code Playgroud)
如果没有,请描述"不起作用".
private void Form2_Load(object sender, EventArgs e)
{
Program.timer.Tick += timer_Tick;
Close();
/// I've tried Dispose() method instead of Close() . but didn't work
}
Run Code Online (Sandbox Code Playgroud)
这很奇怪,但我认为这是问题的人工代码.
您的全局Program.Timer现在存储对Form2实例的引用,并且不会被收集.它不会阻止它被处置/关闭,因此您的计时器将继续触发已关闭的表格,这通常会失败并导致其他问题.
Program.timer.Tick -= timer_Tick;