处置winforms用户控制与图片框-目前泄漏的内存

本文关键字:目前 泄漏 内存 用户 winforms 控制 处置 | 更新日期: 2023-09-27 17:53:27

首先,我已经阅读了多个问题和答案相似但与我遇到的问题不同-我相信这不是重复的。

简而言之,我的应用程序正在泄漏内存。

我有一个Flowpanel包含一个UserControl的多个实例,其中包含两个Picturebox控件和一个Label和一个ToolTip

我的Usercontrol是不可变的,每个实例包含一些状态信息和一对来自Properties.Resources对象的图像。

当状态改变时,我从flowpanel中删除usercontrol,并用一个新的替换它。这导致我的应用程序的内存使用量不断增加。

我怀疑我没有正确处置用户控件或图片框-但不确定在哪里?

用户:

public partial class ucArrayStatus : UserControl
{
    private ToolTip toolTip = new ToolTip();
    public ucArrayStatus(string arrayDesc, ArrayStatus status /*this is an enum*/)
    {
        InitializeComponent();
        labArrayDesc.Text = arrayDesc;
        labStatus.Text = status.ToString();
        toolTip.SetToolTip(this, status.ToString());
        if (status == ArrayStatus.Complete)
        {
            //pbStatusIcon is a PictureBox control
            pbStatusIcon.Image = Properties.Resources.complete;
            pbStatusIcon.SizeMode = PictureBoxSizeMode.Zoom;
        }
        else
        {
            pbStatusIcon.Image = Properties.Resources.working;
            pbStatusIcon.SizeMode = PictureBoxSizeMode.CenterImage;
        }
    }
}

我需要添加一个Dispose()到这个类来显式地处理图像吗?

创建和删除usercontrols:

public class ArrayUIHandler
{
    //store each usercontrol in a specific order indexed by this dictionary
    private Dictionary<int, ucArrayStatus> configToControl = new Dictionary<int, ucArrayStatus>();
    private void ApplyStatusItem(int index, ArrayStatus status)
    {
        var item = new ucArrayStatus(CreateArrayStatusDescription(), status);
        container.Invoke((Action)(() =>
        {
            lock (accessLock)
            {
                if (!configToControl.ContainsKey(index))
                {
                    Logger.Log("UpdateStatus(): Unable to find array: {0}. ControlCount: {1}", index, 
                                container.Controls.Count);
                }
                var c = configToControl[index]; //extract from dictionary
                var controlIndex = container.Controls.IndexOf(c); //retrieve from flowpanel           
                container.Controls.Remove(c); //remove from flowpanel controlcollection
                configToControl.Remove(index); //remove from dictionary
//dispose (not sure if more is needed here, or to implement dispose in the usercontrol??)
                c.Dispose();
                c = null; //explicitly set to null - not sure if needed?
                container.Controls.Add(item); //add new usercontrol to flowpanel
                container.Controls.SetChildIndex(item, controlIndex); //set index position
                configToControl.Add(index, item); //add to dictionary
            }
        }));
    }
}

我看到的大多数帖子都有问题,由于从文件或字节数组等加载图像,这是否适用于使用Resources对象,因为我在这里?

Edit1

给usercontrol添加一个Dispose()方法似乎并不能解决这个问题。

代码:

protected override void Dispose(bool disposing)
{
    if (disposing && (pbStatusIcon.Image != null))
    {
        pbStatusIcon.Image.Dispose();
        pbStatusIcon.Image = null;
        pbStatusIcon.Dispose();
    }
    if (disposing && (components != null))
    {
        components.Dispose();
    }
    base.Dispose(disposing);
}

处置winforms用户控制与图片框-目前泄漏的内存

我有一个类似的问题,我搞砸了一些事情,发现这个工作。

处理图像(我将我的设置作为变量)

pictureBox1Image.Dispose ();

pictureBox1。BackgroundImage = null;

我建议先试一下,看看是否有帮助。

检查您拥有的所有Disposable对象,并对它们调用Dispose。我可以看到你有一个工具提示,它是Disposable。确保您处理了所有一次性实例。这是一般的最佳实践规则。