如何在c#中释放应用程序内存?

如何在c#中释放应用程序内存?,c#,C#,在我的c#应用程序加载表中,我加载了30张图片,这会使我的内存变满,如果我添加更多图片,我会收到“我的内存已满”的消息 如何释放内存或增加最大使用内存 有没有其他方法可以让我的所有图片都进入图片框而不填满我的记忆 1)如何释放内存或增加最大使用内存? 您是否接收到OutOfMemoryException,并且您的计算机内存未满?这可能是由于x86编译,您应该将其更改为x64 2)有没有其他方法可以让我的所有图片都进入图片框而不填满我的记忆? 是和否。如果使用位图,它将在内存中分配图像。如果以后在

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

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

    您是否接收到OutOfMemoryException,并且您的计算机内存未满?这可能是由于x86编译,您应该将其更改为x64

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

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

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

    using (Bitmap bitmap = new Bitmap("file.jpg")
    {
         // bitmap handling here
    }
    
    当然,如果你把它显示在一个图片盒中,你不能处理它,但同样,你的问题不是很清楚

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

    阅读:

    更新

        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);
            }
        }
    
    在修复你的线程时,我注意到你给出了一个图像,但是格式被破坏了

    阅读我的答案,它应该会帮助你(特别是压缩部分)。您也可以更改为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,看看是否有效

    从代码中删除所有位图bmp=新位图,并使用
    PictureBoxInstance.Image=GetCompressedFile(…)显示

    检查
    ExampleMethod()

    基于以下内容的代码:

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


    注意:在移动中压缩文件您可能会在内存中同时出现两个图像(压缩和未压缩)

    请提供更多信息:代码(如问题中的文本:图像太难阅读)、错误细节(问题中)、图像有多大,以及(关键):这是什么类型的应用程序?(WPF,WebForms,…?这是.NET Core吗?)c#表单,这是我在加载表单中加载图片的方式,这是一个示例:位图bmpQ10=新位图(“c:\\Users\\hp\\Desktop\\Arconic\U Final\\ArconicFinal\\DMS\\acceuilTEAM1.jpg”);PictureBexteam1.Image=bmpQ10,,我这样做了30张图片请编辑问题以获取更多信息(注释中的代码,特别是没有格式的代码,很难阅读)。非常感谢,我知道我的问题一点也不清楚,第一是因为我的英语,第二是因为我知道这里,我真的不知道如何正确使用这个网站。请阅读我的答案,并向我汇报。它应该会起作用。我已经用没有出现的图像解决了你的问题。请阅读:因为你回答了我的第一个问题,我可以在我的应用程序中加载更多的图片和使用更多的内存,但是72%的人害怕我的应用程序太重,在将所有图片加载到picturebox后,我希望如何使我的内存变空,或者如何使我的位图不重你对我的第一个问题的回答很好,这将为我的应用程序增加更多内存,并且不再停止,我也使用了你的方法来降低质量,但这并没有使我的内存使用量减少。内存使用量仍然会在系统内存上使用很多。压缩的想法是降低图像的大小。您是否检查过它是否使用较少的过程监视器?