关闭后处理表格

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秒后显示消息框!

Hen*_*man 9

编辑:这个问题原来是关于Dispose.

首先,Dispose注意垃圾收集.发生以下情况:

  1. 你有一个全局的Timer实例
  2. 你创建form2
  3. Form2订阅计时器
  4. Form2已关闭和/或处置
  5. Timer事件触发,递增计数器并显示MessageBox
  6. Timer事件一直持续触发,直到App关闭.

要理解的要点是,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实例的引用,并且不会被收集.它不会阻止它被处置/关闭,因此您的计时器将继续触发已关闭的表格,这通常会失败并导致其他问题.

  1. 不要这样做(给Form2它自己的计时器)
  2. 使用FormClosed事件取消订阅: Program.timer.Tick -= timer_Tick;

  • +1对于建议使用声明,可能想给他一个例子. (2认同)