分享
三行代码  ›  专栏  ›  技术社区  ›  Ares

如何避免在使用Windows窗体C时增加内存?

  •  0
  • Ares  · 技术社区  · 1 周前

    我正在用C语言在Windows窗体中编程一个库存系统,我用 管理仪表板 看。我正在使用MDI,我通过单击 产品 按钮。

    enter image description here

    加载子窗体时一切正常: enter image description here

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

    儿童形态的东西

    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(); 是导致问题的原因,因为每当我单击按钮显示窗体时,它都会创建新对象。

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

    1 回复  |  直到 1 周前
        1
  •  2
  •   default locale    1 周前

    可以使用检查产品窗体是否已打开 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());