0

我创建了一个示例 Windows 窗体应用程序,其中包含两个窗体 - form1 和 form2。

Form1 包含一个按钮,单击时我将 form2 显示为一个对话框,如下所示。

private void button1_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2();
            try
            {
                form2.ShowDialog();
            }
            catch (Exception ex)
            {

            }
            finally
            {
                if (form2 != null)
                {
                    form2.Dispose();
                    form2 = null;
                }
            }   

        }

然后我检查了应用程序,例如单击按钮,然后它将打开 form2,关闭它。并持续了大约 6 次。

当我使用DevPartner检查应用程序时,它总是显示Form2 form2 = new Form2();为泄漏

当我在网上检查时,它说如果我们使用 ShowDialog,我们需要在关闭它后处理表单,即为什么我尝试在 finally 块中处理。但它仍然显示该行泄漏。任何人都可以就这次泄漏提出您的建议。

4

3 回答 3

0

通常,当您使用IDisposable对象时,您应该在using 语句中声明和实例化它。using 语句以正确的方式调用对象上的Dispose 方法,并且一旦调用 Dispose,它还会导致对象本身超出范围。在 using 块中,对象是只读的,不能修改或重新分配。

using 语句可确保调用Dispose,即使在调用对象上的方法时发生异常也是如此。

于 2013-08-08T07:35:49.630 回答
0

You should investigate your Form2 to find any subsctioptions to external events and rooted refferencies. All of them should be removed on form dispose.

In the following code the caues of the leak is a subscription to the Idle event. Subscription is removed in Dispose method to avoid a leak.

Form2()
{
    Application.Idle += Application_Idle;
}

void Application_Idle(object sender, EventArgs e)
{   
}   

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        Application.Idle -= Application_Idle;
    }
}
于 2013-08-08T07:30:46.540 回答
0

这可能是您工具的检查规则,因为实例的创建不在 try-catch 中。

试试这样:

private void button1_Click(object sender, EventArgs e) {
    Form2 form2;
    try {
        form2 = new Form2();
        form2.ShowDialog();
    } finally {
        if (form2 != null) {
            form2.Dispose();
            form2 = null;
        }
    }
}

或者更简单:

private void button1_Click(object sender, EventArgs e) {
    using (var form2 = new Form2()) {
        form2.ShowDialog();
    }
}
于 2013-08-08T08:19:56.397 回答