处置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);
}
我有一个类似的问题,我搞砸了一些事情,发现这个工作。
处理图像(我将我的设置作为变量)
pictureBox1Image.Dispose ();
pictureBox1。BackgroundImage = null;
我建议先试一下,看看是否有帮助。
检查您拥有的所有Disposable对象,并对它们调用Dispose。我可以看到你有一个工具提示,它是Disposable。确保您处理了所有一次性实例。这是一般的最佳实践规则。