不断添加和删除流布局面板赢得表单
本文关键字:表单 流布局 添加 删除 | 更新日期: 2023-09-27 18:31:16
我有一个 c# win Forms 应用程序,其中包含一个flowLayoutPanel
。
我需要每秒更新此面板中的所有子项。
这是我当前的代码,每 1 秒在系统计时器中调用一次:
public void RefreshReceiversPage()
{
if (checkBox_enableReceivers.Checked)
{
var receivers = OutgoingReceiverManager.GetCopyOfActiveRecieverHolders();
for (int i = 0; i < flowLayoutPanel_receivers.Controls.Count; i++)
{
var tmp = flowLayoutPanel_receivers.Controls[i];
flowLayoutPanel_receivers.Controls[i].Dispose();
tmp.Dispose();
}
flowLayoutPanel_receivers.Controls.Clear();
foreach (var item in receivers.ToList())
{
var tmpUc = new ucReceiverItem(item);
if (flowLayoutPanel_receivers != null)
{
try
{
flowLayoutPanel_receivers.Controls.Add(tmpUc);
}
catch
{
}
}
}
receivers = null;
}
}
现在这段代码可以完美运行大约 2 分钟,然后突然间我开始变得error creating window handle
因此,我在上面的代码中尝试捕获的原因。
但是发生这种情况后,窗格视图变得有趣,如果不再次启动程序,我将无法恢复它。
我已经搜索了高低,我似乎找不到任何关于被抛出的异常的东西?
我所能想到的是,我可能没有正确处理对象,并且在某个地方耗尽了内存?
有人有任何建议或解决方案吗?
编辑:
这是UCRecieverItem:
public partial class ucReceiverItem : UserControl
{
public ucReceiverItem(ReceiverHolder item)
{
InitializeComponent();
ConstructItem(item);
item = null;
}
private void ConstructItem(ReceiverHolder item)
{
label_name.Text = item.ReceiverDb.Name;
label_numberOfConnections.Text = item.ReceiverOutgoingConnectionManager.GetNumberOfConnections().ToString();
label_mrFilters.Text = item.ReceiverDb.MrFilters;
label_multipleConnections.Text = item.ReceiverDb.MultipleConnections.ToString();
//
int count = item.GetActiveBufferCount();
int size = item.GetActiveBufferSize();
//
label_bufferCount.Text = count + @" / " + size;
progressBar_buffer.Maximum = size;
progressBar_buffer.Minimum = 0;
progressBar_buffer.Value = count;
}
}
这段代码是一个问题:
for (int i = 0; i < flowLayoutPanel_receivers.Controls.Count; i++)
{
var tmp = flowLayoutPanel_receivers.Controls[i];
flowLayoutPanel_receivers.Controls[i].Dispose();
tmp.Dispose();
}
flowLayoutPanel_receivers.Controls.Clear();
它只释放容器中一半的控件。 另一半被Controls.Clear();
调用删除,但这些控件不会被释放 - 因此它们仍然存在并且正在耗尽内存。
每一秒都这样做会使问题复杂化:这可能是很多控件。
当务之急是正确处置控件:
while (flowLayoutPanel_receivers.Controls.Count > 0) {
flowLayoutPanel_receivers.Controls[0].Dispose();
}
在那之后,我会质疑每一秒都这样做的必要性——对于用户来说,这似乎是一个恶劣的环境。