2

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

此代码在 ASP.NET MVC 项目的不同线程中执行。作为

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 方法并行调用的。

我的网站的其余部分只是使用实体框架进行简单的数据库访问,我怀疑这会导致任何高达 3GB 内存使用的内存泄漏。

4

1 回答 1

1

我尝试将它放在一个独立测试程序中的循环中,并使用显式 GC.Collect() 跟踪该函数。至少在 .NET 4.5 上,这表明这段代码没有泄漏——在多次调用后内存保持稳定。

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

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

于 2013-02-02T23:34:16.970 回答