我有以下图片调整大小并保存代码。
此代码在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 :(得分:1)
我尝试将其置于独立测试程序的循环中,并使用显式GC.Collect()跟随该函数。至少在.NET 4.5上,这表明此代码不会泄漏 - 许多调用后内存保持稳定。
我认为您需要查看代码中的其他位置。您应该尝试使用Analyze>进行分析。启动性能向导...并选择.NET内存分配并查看正在使用内存的内容。
为了好玩,我还尝试了.NET 3.5并且没有遇到泄漏。