WPF图像大小调整中的内存泄漏

时间:2013-02-02 09:57:49

标签: wpf asp.net-mvc memory-leaks image-resizing

我有以下图片调整大小并保存代码。

此代码在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的内存使用量。

1 个答案:

答案 0 :(得分:1)

我尝试将其置于独立测试程序的循环中,并使用显式GC.Collect()跟随该函数。至少在.NET 4.5上,这表明此代码不会泄漏 - 许多调用后内存保持稳定。

我认为您需要查看代码中的其他位置。您应该尝试使用Analyze>进行分析。启动性能向导...并选择.NET内存分配并查看正在使用内存的内容。

为了好玩,我还尝试了.NET 3.5并且没有遇到泄漏。