簡體   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