不断添加和删除流布局面板赢得表单

本文关键字:表单 流布局 添加 删除 | 更新日期: 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();
}

在那之后,我会质疑每一秒都这样做的必要性——对于用户来说,这似乎是一个恶劣的环境。