繁体   English   中英

我如何在 C# 中释放我的应用程序内存?

[英]How i can free my application memory in c#?

在我的 C# 应用程序加载表单中,我加载了 30 张图片,这会使我的记忆变满,如果我添加更多图片,我会收到消息“我的记忆已满”

  1. 如何释放内存或增加最大已用内存?
  2. 有没有其他方法可以让我的所有图片都放入图片框而不填满我的记忆?

https://i.stack.imgur.com/bFVjy.png

1) 如何释放内存或增加最大已用内存?

您是否收到 OutOfMemoryException 并且您的内存没有填满您的机器? 这可能是由于 x86 编译造成的,您应该将其更改为 x64。

2)有没有其他方法可以将我所有的图片都放入图片框而不填充我的记忆?

是和否。 如果您使用位图,它将在内存中分配图像。 如果您稍后将所有图像一起重新创建图像而不压缩它,那么如果您没有正确处理位图,您也可能会丢失一些内存。 您可以加载它们,压缩它们,然后处理原始的,将压缩/优化的保存在内存中。

此外,请记住在使用后始终处理您的位图。 GC 通常会处理它们,但您应该始终处理它们:

using (Bitmap bitmap = new Bitmap("file.jpg")
{
     // bitmap handling here
}

当然,如果您在图片框中显示它,则无法处理它,但同样,您的问题并不完全清楚。

没有您的代码,我无法为您提供更好的答案,如果您更新问题,我很乐意编辑此答案。

读:

在通过网络发送之前压缩位图

我什么时候需要在图形上使用 dispose()?

更新

修复您的线程后,我注意到您提供了一个图像,但格式已损坏。

阅读我的回答,它应该对您有所帮助(特别是压缩部分)。 您也可以更改为 x64。

更新 2 - 压缩代码示例

    public void ExampleMethod()
    {
        pictureBox1.Image = GetCompressedFile("file.jpg", quality: 10);
    }

    private Image GetCompressedFile(string fileName, long quality)
    {
        using (Bitmap bitmap = new Bitmap(fileName))
        {
            return GetCompressedBitmap(bitmap, quality);
        }
    }

    private Image GetCompressedBitmap(Bitmap bmp, long quality)
    {
        using (var mss = new MemoryStream())
        {
            EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
            ImageCodecInfo imageCodec = ImageCodecInfo.GetImageEncoders().FirstOrDefault(o => o.FormatID == ImageFormat.Jpeg.Guid);
            EncoderParameters parameters = new EncoderParameters(1);
            parameters.Param[0] = qualityParam;
            bmp.Save(mss, imageCodec, parameters);
            return Image.FromStream(mss);
        }
    }

在质量参数中设置质量。 100 表示 100%,50 表示 50%。

尝试将质量设置为 10,看看它是否有效。

从代码中删除所有 Bitmap bmp = new Bitmap,并与您的PictureBoxInstance.Image = GetCompressedFile(...);一起显示PictureBoxInstance.Image = GetCompressedFile(...);

检查ExampleMethod()

代码基于: https : //stackoverflow.com/a/48274706/4352946

不过,您必须记住,即使使用 Dispose,也不会立即释放内存,您应该等待 GC。

PS:在旅途中压缩文件你可能最终会在内存中得到两个图像(压缩的和未压缩的)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM