表单关闭时的可用内存

时间:2017-09-01 17:59:10

标签: c# forms winforms memory-management

我有两种形式“主要”和“客户”。应用程序从Main开始,它包含一个打开第二个按钮的按钮。但是当我关闭客户端时,进程内存(Visual Studio诊断工具)不会减少,如果我再次打开表单,它会引发(就像它创建另一个实例而不会破坏前一个实例)。我已经创建了析构函数方法,只是为了看它是否被调用,但它没有。

public partial class MainMenu : Form {
    public MainMenu() {
        InitializeComponent();
    }

    private void button2_Click(object sender, EventArgs e) {
        //Data obtained from API
        List<Client> clientList = new List<Client> {
            new Client(0, 0, "Ralph", "asd", "asd", "asd", "asd", "asd", "asd", "asd", "asd")
        };

        //I bind this list to BindingSource of Client form
        BindingListView<Client> cL = new BindingListView<Client>(clientList);

        //Client form
        BaseForm<Client> form = new BaseForm<Client>(new UI.Content.ClientContent(), cL, Measures.ClientsFormSize);            
        form.Show();
    }
}

这适用于客户表格:

public partial class BaseForm<T> : Form {
    public class SearchItem {
        private string name;
        private string value;

        public string Name { get => name; }
        public string Value { get => value; }

        public SearchItem(string name, string value) {
            this.name = name;
            this.value = value;
        }

        public override string ToString() {
            return name;
        }
    }

    private UserStatus currentStatus;
    private Forms.BaseContent formContent;
    private List<ICustomControl> controlList;
    private int registers;

    internal BindingListView<T> Data {
        get => (BindingListView<T>)formContent.BindSource.List;
        set {
            formContent.BindSource.DataSource = value;
        }
    }

    internal BaseForm(Forms.BaseContent content, BindingListView<T> data, Size formSize) : this(content, data) {
        Size = formSize;
    }

    internal BaseForm(Forms.BaseContent content, BindingListView<T> data) : this(content) {
        Data = data;
        registers = Data.Count;
        Last();
    }

    internal BaseForm(Forms.BaseContent formContent) : this() {
        this.formContent = formContent;
        FitContentToPanel();
    }

    internal BaseForm() {
        InitializeComponent();
        currentStatus = UserStatus.View;
    }
}

我认为这是因为form永远不会被指定为null,因此GC不会接受它。我试过做一个静态成员并覆盖OnClosingForm以阻止关闭,但我认为还有更好的方法。

2 个答案:

答案 0 :(得分:2)

使用此语法可以更快地处理内存:

using (YourForm f = new YourForm())
{
    // ...
    f.ShowDialog();
}

答案 1 :(得分:1)

关闭子表单后,GC不应立即回收内存。

在打开子表单之前和表单关闭之后,通过调用.Collect() 2-3次尝试强制收集。如果没有释放内存,那就意味着你有内存泄漏。

GC.Collect();   
GC.Collect();   
GC.Collect();   

为了澄清,我建议强制GC只收集内存作为在调试时检查内存的快速而肮脏的方法。不要签入此类代码,也不要将其包含在发行版中。