WPF图像大小调整中的内存泄漏
我有以下图片调整大小和保存代码 此代码在ASP.NET MVC项目的不同线程中执行。作为WPF图像大小调整中的内存泄漏,wpf,asp.net-mvc,memory-leaks,image-resizing,Wpf,Asp.net Mvc,Memory Leaks,Image Resizing,我有以下图片调整大小和保存代码 此代码在ASP.NET MVC项目的不同线程中执行。作为 using (FileStream fs = new FileStream(file.File.FullName, FileMode.Open, FileAccess.Read, FileShare.Read)) { BitmapDecoder decoder = BitmapDecoder.Create(fs, BitmapCreateOpt
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。我尝试将其放入独立测试程序的循环中,并使用显式GC.Collect()跟踪该函数。至少在.NET4.5上,这表明该代码没有泄漏——在多次调用后,内存保持稳定 我认为您需要查看代码中的其他地方。您应该尝试使用分析>启动性能向导来分析它。。。然后选择.NET内存分配并查看内存的使用情况
为了好玩,我还尝试了.NET 3.5,但也没有遇到泄漏。我开发了客户端WPF代码,所以我使用内置探查器或.NET内存探查器()。这些实验室我对服务器的帮助()谢谢,我会研究它,但是如果你使用WPF客户端,那么内存泄漏可能不会发生,因为WPF可能正在清除它,但是如果我在不同的线程上运行这个,那么我可能会错过一些清理。你曾经修复过这个问题吗?我也有同样的问题。加载18位MapImage使我的内存达到1GB。有没有办法只在图像显示时将其加载到内存中?没有,我在不同的iis网站上移动了所有内容,并为每100个请求设置了worker process recycle。