2013-02-02 26 views
2

我有以下圖像調整大小和保存代碼。WPF圖像調整大小的內存泄漏

此代碼在ASP.NET MVC Project中的不同線程中執行。作爲

using (FileStream fs = new FileStream(file.File.FullName, 
       FileMode.Open, FileAccess.Read, FileShare.Read)) 
{ 
    BitmapDecoder decoder = BitmapDecoder.Create(fs, 
      BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None); 

    var img = decoder.Frames[0]; 
    img.Freeze(); 
    double width = Size; 
    double height = Size; 

    if (img.PixelWidth > img.PixelHeight) 
    { 
     height = (int)(((double)img.PixelHeight/(double)img.PixelWidth) 
      * (double)width); 
    } 
    else 
    { 
     width = (int)(((double)img.PixelWidth/(double)img.PixelHeight) 
      * (double)height); 
    } 

    var target = new TransformedBitmap(img, 
     new ScaleTransform(width/(double)img.PixelWidth, height 
       /(double)img.PixelHeight, 0, 0)); 

    RenderOptions.SetBitmapScalingMode(target, BitmapScalingMode.HighQuality); 

    var t = BitmapFrame.Create(target); 
    RenderOptions.SetBitmapScalingMode(t, BitmapScalingMode.HighQuality); 

    target.Freeze(); 
    t.Freeze(); 
    JpegBitmapEncoder enc = new JpegBitmapEncoder(); 
    enc.Frames.Add(t); 
    enc.QualityLevel = 90; 
    using (FileStream fsout = saved.File.OpenWrite()) 
    { 
     enc.Save(fsout); 
    } 
} 

我一直在使用周圍的每一個IDisposable的對象使用WPF對象不實現IDisposable所以我不能手動處理它們。

我在某處調用Freeze會阻止內存泄漏,但即使在此之後,也沒有任何改進。這個過程的內存使用量不斷增加。

我需要的是,上傳圖片時,必須使用4種不同的分辨率(150x150,350x350,700x700和1000x1000)調整大小,使用Parallel.ForEach方法並行調用每個分辨率。

我餘下的網站很簡單簡單使用Entity Framework的數據庫訪問,我懷疑可能導致任何內存泄漏高達3GB的內存使用情況。

+0

你有沒有得到這個修復?我有這個相同的問題。加載18 BitmapImages使我的內存達到1GB。有沒有辦法只在內存中加載圖像? – AndrewRalon

+0

不,我將所有內容都移動到了不同的iis網站上,並且我爲每100個請求設置了工作流程回收站。 –

回答

1

我試着把它放在一個獨立的測試程序的循環中,然後使用顯式的GC.Collect()跟着函數。至少在.NET 4.5上,這表明這段代碼不會泄漏 - 在多次調用後內存保持穩定。

我想你需要在你的代碼的其他地方看看。您應該嘗試使用Analyze> Launch Performance Wizard ...進行分析,然後選擇.NET Memory Allocations並查看內存的使用情況。

爲了好玩,我也嘗試過.NET 3.5,並沒有遇到任何漏洞。

+0

謝謝,我如何在服務器上進行配置文件? –

+0

我開發客戶端WPF代碼,因此我使用內置的Profiler或.NET Memory Profiler(http://memprofiler.com)。這些實驗室我的服務器的幫助(http://blogs.msdn.com/b/tess/archive/2008/03/25/net-debugging-demos-lab-7-memory-leak.aspx) – jschroedl

+0

謝謝,我會看看它,但是如果你正在使用WPF客戶端,那麼內存泄漏可能不會發生,因爲WPF可能會清除它,但如果我在不同的線程上運行這個,那麼我可能會錯過一些清理。 –