如何避免使用 Windows Forms C# 增加 onLoad 内容的内存?

How to avoid increasing memory on onLoad stuff using Windows Forms C#?

我正在使用 C# 在 Windows 表单中编写一个库存系统,我用 管理仪表板 外观设计了它。我正在使用 MDI,我通过单击 products 按钮加载产品。

加载 child 表单时一切正常:

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

这是我的代码:

正在从 parent 加载 child 表单:

  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;
    }

}

child表格内容

public partial class Inventario : BaseContext
{

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        CargarLista();

    }

    public virtual void CargarLista()
    {
        var productos = _inventarioRepository.GetList();
        ListaProductos.DataSource = productos;

    }


}

基本上下文

public class BaseContext: Form
{
    // contexto base, todos los forms deben heredar esta clase por orden.

    private bool _disposed = false;
    protected Context _context { get; set; }

    public BaseContext()
    {
        _context = new Context();
    }

    protected override void Dispose(bool disposing)
    {
        if (_disposed) return;
        if (disposing) _context.Dispose();
        _disposed = true;
        base.Dispose(disposing);
    }
}

我认为 var frm = new Inventario(); 导致了问题,因为每次我单击按钮显示表单时它都会创建新的 object。

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

I think another good idea would be that when I click products button it will not load the form because it is already opened. I think the second option would he good.

您可以使用 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();
    ...

更新:您还可以创建一个通用方法,您可以将其用于不同类型的表单:

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());