Как избежать увеличения памяти на материалах onLoad, используя Windows Forms C#? - PullRequest
0 голосов
/ 02 августа 2020

Я программирую систему инвентаризации в Windows формах, используя C#, и я разработал ее с помощью панели администратора . Я использую MDI и загружаю продукты, нажимая кнопку products .

enter image description here

When loading the child form everything works ok: введите описание изображения здесь

Но когда я загружаю продукты снова и снова, я заметил, что в 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 Forms. Как решить эту проблему потребления памяти каждый раз, когда я открыть или обновить форму товаров?

1 Ответ

2 голосов
/ 02 августа 2020

Думаю, еще одна хорошая идея - когда я нажимаю кнопку «Товары», форма не загружается, потому что она уже открыта. Думаю, второй вариант ему подойдет.

Вы можете проверить, открыта ли уже форма продукта, используя 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();
    ...

ОБНОВЛЕНИЕ: Вы также можете создать общий метод c, который можно использовать с различными типами форм:

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