减少动态添加控件的内存使用
Decrease memory usage of dynamically added controls
我有以下代码将图像从文件添加到 Windows 表单面板控件。
private void AddImageButton_Click(object sender, EventArgs e)
{
if (AddImageFileDialog.ShowDialog() == DialogResult.OK)
{
using (FileStream stream = new FileStream(AddImageFileDialog.FileName, FileMode.Open, FileAccess.Read))
using (BinaryReader reader = new BinaryReader(stream))
{
var memoryStream = new MemoryStream(reader.ReadBytes((int)stream.Length));
AddImage(new Bitmap(memoryStream));
}
}
}
private void AddImage(Bitmap image)
{
var pictureBox = new PictureBox();
pictureBox.Name = Guid.NewGuid().ToString();
pictureBox.Image = image;
pictureBox.Width = 40;
pictureBox.Height = 40;
pictureBox.SizeMode = PictureBoxSizeMode.Zoom;
pictureBox.Click += OnImageClicked;
ImagePanel.Controls.Add(pictureBox);
}
1) 当我 运行 我的应用程序时,内存使用量约为 18 MB。
2) 当我打开一个 FileDialog window 时,内存使用量约为 50MB。
3) 每添加一张图片,内存就会增加 2-10MB。
所以如果我添加 20 张图像,内存使用量将超过 100MB。
我觉得我做错了什么,但我不知道具体是什么。你能帮我找到我的错误并解释为什么存在这个问题吗?
更新 0
我通过将源大位图复制到新位图 40x40px 并调用大位图 Dispose() 来部分解决问题。但我的应用程序仍在使用大约 50 MB 的内存。我认为问题的根源是 FileDialog。它吃内存。
问题已通过 更新 0 修复。看看吧
我有以下代码将图像从文件添加到 Windows 表单面板控件。
private void AddImageButton_Click(object sender, EventArgs e)
{
if (AddImageFileDialog.ShowDialog() == DialogResult.OK)
{
using (FileStream stream = new FileStream(AddImageFileDialog.FileName, FileMode.Open, FileAccess.Read))
using (BinaryReader reader = new BinaryReader(stream))
{
var memoryStream = new MemoryStream(reader.ReadBytes((int)stream.Length));
AddImage(new Bitmap(memoryStream));
}
}
}
private void AddImage(Bitmap image)
{
var pictureBox = new PictureBox();
pictureBox.Name = Guid.NewGuid().ToString();
pictureBox.Image = image;
pictureBox.Width = 40;
pictureBox.Height = 40;
pictureBox.SizeMode = PictureBoxSizeMode.Zoom;
pictureBox.Click += OnImageClicked;
ImagePanel.Controls.Add(pictureBox);
}
1) 当我 运行 我的应用程序时,内存使用量约为 18 MB。
2) 当我打开一个 FileDialog window 时,内存使用量约为 50MB。
3) 每添加一张图片,内存就会增加 2-10MB。
所以如果我添加 20 张图像,内存使用量将超过 100MB。
我觉得我做错了什么,但我不知道具体是什么。你能帮我找到我的错误并解释为什么存在这个问题吗?
更新 0
我通过将源大位图复制到新位图 40x40px 并调用大位图 Dispose() 来部分解决问题。但我的应用程序仍在使用大约 50 MB 的内存。我认为问题的根源是 FileDialog。它吃内存。
问题已通过 更新 0 修复。看看吧