摧毁表格

时间:2013-11-19 09:10:28

标签: c# winforms garbage-collection destructor

我该怎么做?

销毁下,我的意思是将其从内存中移除

一个例子(Form1是某种形式):

static void Main()
{
    Test();
    // here we still have A alive
    // GC.Collect()  doesn't helps

    Form1 B = new Form1();
    Application.Run(B);
    // problem is here: B and A "collides", due to assumption what A is already dead
}

public static Test()
{
    Form1 A = new Form1();
    // do something with A, but not displaying form
    // I was sure what A will disappears after Test()
}

问题可能是表单上使用的某些组件吗?定时器,是在构造函数中创建的?或者,这是一种正常方式,A存在多久?

更新

碰撞 - 意味着他们正在使用仅限单个用户专有的东西。如何推送从内存中删除A的过程?

请,不要匆忙(感谢-2),我在工作,所以无法快速更新。我想尽可能地清楚。

每当你可以,请避免使用陈词滥调 GC.Collect总是不好,等我知道。正如您所看到的,我需要在软件运行之前对表单进行一些操作,因此不会出现性能或任何其他类型的问题。这可能不是最好的情况,但请告诉我更好的情况。用A做某事是必要的考验,是的。

问题是:用A做测试后,我想让它消失。当然,我可以修改A,它不会有定时器,组件等。但是已经有几十种形式了。所有这些都必须经过测试。我只是不知道在Test()之后A会存在什么。

更新2

我真的想知道为什么问题有-3。我今天学到的是当你创建一个表单时,它将存在直到应用程序结束并且现在已知有杀死它的方法。在构造函数中创建的计时器将继续运行,组件将尝试访问他们不应该访问的东西,等等。一旦你想要创建第二个工作实例(看起来像),那么很多东西都会改变。

更新3

让我们做一个简单的测试:

static class Program
{
    public static bool Test { get; set; }
    static void Main()
    {
        DoTest();
        Test = true;
        Application.Run(new Form1());
    }

    static void DoTest()
    {
        var A = new Form1();
        var B = new Form1();
        var C = new Form1();
        //A.Dispose();
        //B.Dispose();
        //C.Dispose();
    }
}

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (Program.Test)
        {
            timer1.Stop();
            MessageBox.Show("123");
        }
    }
}

它将显示4个消息框(来自主窗口和来自不死生物 A,B,C)。在今天之前,我百分百肯定,我在表格中提出的内容将与表格一起删除。每当我创建一个局部变量时 - 它将是本地变量。但似乎并非如此。这是一个问题 - 不明显的行为。

看起来像Dispose()的Thorsten Dittmar解决方案应该做一个技巧。我应该看看自己的组件(手动关闭他们的计时器等)。

1 个答案:

答案 0 :(得分:1)

你应该致电Dispose()。即使这并不意味着立即释放所有内存,但是如果表单编程正确,那么表单打开的所有资源(定时器,文件等)都应该关闭。

当然,下次运行GC时表格也会自动处理,但您可以自己拨打Dispose()手动“消失”。然后GC会在运行时运行并处理内存,但是应该释放窗口占用的其他资源。

最简单的方法是:

public static Test() {
    using (Form1 A = new Form1()) {
        // do something with A, but not displaying form
        // I was sure what A will disappears after Test() 
    }
}