我有两种形式“主要”和“客户”。应用程序从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
以阻止关闭,但我认为还有更好的方法。
答案 0 :(得分:2)
使用此语法可以更快地处理内存:
using (YourForm f = new YourForm())
{
// ...
f.ShowDialog();
}
答案 1 :(得分:1)
关闭子表单后,GC不应立即回收内存。
在打开子表单之前和表单关闭之后,通过调用.Collect()
2-3次尝试强制收集。如果没有释放内存,那就意味着你有内存泄漏。
GC.Collect();
GC.Collect();
GC.Collect();
为了澄清,我建议强制GC只收集内存作为在调试时检查内存的快速而肮脏的方法。不要签入此类代码,也不要将其包含在发行版中。