C# 如何避免使用Windows窗体C增加已加载内容的内存?

C# 如何避免使用Windows窗体C增加已加载内容的内存?,c#,winforms,entity-framework,mdi,C#,Winforms,Entity Framework,Mdi,我正在用C#在Windows窗体中编程一个库存系统,我设计了一个管理仪表盘。我正在使用MDI,通过单击“产品”按钮加载产品 加载子窗体时,一切正常: 但是,当我一次又一次地加载产品时,我注意到在Windows任务管理器中,每当我加载产品或单击“产品”按钮时,程序都会消耗太多内存。内存消耗非常大 这是我的代码: 从父级加载子窗体: public partial class Layout2 : BaseContext { public Layout2() {

我正在用C#在Windows窗体中编程一个库存系统,我设计了一个管理仪表盘。我正在使用MDI,通过单击“产品”按钮加载产品

加载子窗体时,一切正常:

但是,当我一次又一次地加载产品时,我注意到在Windows任务管理器中,每当我加载产品或单击“产品”按钮时,程序都会消耗太多内存。内存消耗非常大

这是我的代码:

从父级加载子窗体:

  public partial class Layout2 : BaseContext
{
    public Layout2()
    {
        InitializeComponent();
    }
    
    //loads the products form 
    private void ventas_boton_Click(object sender, EventArgs e)
    {
        var frm = new Inventario();
        frm.TopLevel = false;
        frm.FormBorderStyle = FormBorderStyle.None;
        panel3.Controls.Add(frm);
        frm.WindowState = FormWindowState.Maximized;
        frm.Visible = true;
    }

}
子表单内容

基本上下文

我认为
var frm=newinventario()导致问题,因为每次单击按钮显示表单时,它都在创建新对象

我的问题很简单,但我是Windows窗体的新手,如何解决每次打开或更新产品窗体时的内存消耗问题

我认为另一个好主意是,当我点击产品按钮时,它不会加载表单,因为它已经打开了。我认为第二个选择是好的

您可以使用
panel3.Controls
检查产品表单是否已打开。像这样的方法应该会奏效:

//loads the products form 
private void ventas_boton_Click(object sender, EventArgs e)
{
    if (panel3.Controls.OfType<Inventario>().Any()) return;
    var frm = new Inventario();
    ...
我认为另一个好主意是,当我点击产品按钮时,它不会加载表单,因为它已经打开了。我认为第二个选择是好的

您可以使用
panel3.Controls
检查产品表单是否已打开。像这样的方法应该会奏效:

//loads the products form 
private void ventas_boton_Click(object sender, EventArgs e)
{
    if (panel3.Controls.OfType<Inventario>().Any()) return;
    var frm = new Inventario();
    ...

我不是WinForm程序员,但我认为你走的路是对的。您正在创建一个新对象,并将其反复添加到panel3。您永远不会删除以前添加到panel3的内容。看看这个答案是否有用:因此,每次单击按钮时,它都会打开一个新的子窗体,而您永远不会关闭子窗体。我说的对吗?没错,因为它们是子窗体,所以必须粘贴在面板中,并且不能有关闭按钮。当然,子窗体将保留它们的内存。您需要确定在某个时候关闭以前打开的子窗体的计划。是否要在新的
Inventario
打开时自动关闭它们?是的,单击按钮时关闭上一个子表单是个好主意。我认为另一个好主意是,当我单击products按钮时,它不会再次加载表单,因为它已经打开,这将避免创建新的表单实例。我认为第二个选择会很好。我不是WinForm程序员,但我认为你走的是正确的道路。您正在创建一个新对象,并将其反复添加到panel3。您永远不会删除以前添加到panel3的内容。看看这个答案是否有用:因此,每次单击按钮时,它都会打开一个新的子窗体,而您永远不会关闭子窗体。我说的对吗?没错,因为它们是子窗体,所以必须粘贴在面板中,并且不能有关闭按钮。当然,子窗体将保留它们的内存。您需要确定在某个时候关闭以前打开的子窗体的计划。是否要在新的
Inventario
打开时自动关闭它们?是的,单击按钮时关闭上一个子表单是个好主意。我认为另一个好主意是,当我单击products按钮时,它不会再次加载表单,因为它已经打开,这将避免创建新的表单实例。我认为第二个选择是好的。
//loads the products form 
private void ventas_boton_Click(object sender, EventArgs e)
{
    if (panel3.Controls.OfType<Inventario>().Any()) return;
    var frm = new Inventario();
    ...
private  void AddForm<T>(Func<T> formCreator) where T: Form
{
    var form = panel3.Controls.OfType<T>().FirstOrDefault();
    if (form != null)
    {
        //if the form of a given type already exists bring it to front
        form.BringToFront();
        return;
    }
    form = formCreator();
    form.TopLevel = false;
    form.FormBorderStyle = FormBorderStyle.None;
    form.WindowState = FormWindowState.Maximized;
    form.Visible = true;
    panel3.Controls.Add(form);
}
AddForm(() => new Inventario());
AddForm(() => new ClientForm());