【问题标题】:Decrease memory usage of dynamically added controls减少动态添加控件的内存使用
【发布时间】:2017-12-22 07:35:25
【问题描述】:

我有以下代码将图像从文件添加到 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。它会吃掉内存。

【问题讨论】:

  • 加载和保存图像不是免费的。你期待什么?
  • 您可以在添加图片后尝试关闭您的MemoryStream memoryStream
  • @DanSchnau 您必须根据文档保持 MemoryStream 打开。 msdn.microsoft.com/en-us/library/z7ha67kw(v=vs.110).aspx
  • @DanSchnau 我尝试使用 memoryStream.Close();添加图像后,但它没有帮助。
  • @MickyD 我找到了更新 0 中描述的解决方案。你知道更好的方法吗?

标签: c# .net memory picturebox


【解决方案1】:

更新 0 解决了问题。看看吧。

【讨论】:

  • 这不是一个修复,你只是归咎于一个底层组件。您是否创建了一个只有 fileopendialog 的新应用来查看是否是问题所在?
猜你喜欢
  • 2013-05-21
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多