c# - 减少动态添加控件的内存使用

标签 c# .net memory picturebox

我有以下代码将图像从文件添加到 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 窗口时,内存使用量约为 50MB。

3) 每添加一张图片,内存就会增加 2-10MB。

所以如果我添加 20 张图像,内存使用量将超过 100MB。

我觉得我做错了什么,但我不明白到底是什么。你能帮我找到我的错误并解释为什么存在这个问题吗?

更新 0

我通过将源大位图复制到新位图 40x40px 并调用大位图 Dispose() 来部分解决问题。但我的应用程序仍在使用大约 50 MB 的内存。我认为问题的根源是 FileDialog。它会占用内存。

最佳答案

更新 0 已修复问题。看看吧。

关于c# - 减少动态添加控件的内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47937544/

相关文章:

c# - 命名互斥体的单声道替代品

c# - 如何准确测量Azure Web应用程序中的 "data out"?

c# - 如何: Generate XML file in Visual Studio 'debug' configuration?

C++ 动态内存分配限制

qt - 制作轻量级网络浏览器 - Gecko vs Webkit vs ???; Qt4 vs Qt5 vs?

c++ - 如何避免在高内存使用应用程序中耗尽内存? C/C++

c# - 试图使用已不复存在的对象。 (来自 HRESULT : 0x80030102 (STG_E_REVERTED)) 的异常

c# - AXWindowsMediaPlayer找不到嵌入式资源MP3

c# - SL4 AsyncEventArgs 在第二个 Socket 连接后抛出 InvalidOperationException

c# - SM?使用 if exists drop then create 和 no sp_executesql 编写所有 SQL 存储过程的脚本