如何避免使用 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());
我正在使用 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());