C# 可写位图内存使用

C# 可写位图内存使用,c#,memory,writeablebitmap,C#,Memory,Writeablebitmap,我一直在编写一个程序集来处理一些基本的图像处理,遇到了一个我在解决问题时遇到的绊脚石 问题的关键是,当我创建一个新的System.Windows.Media.Imaging.WriteableBitmap时,进程的私有字节数跳到了令人难以置信的地步。 我的测试控制台应用程序有以下代码和几个断点,可以查看内存使用何时达到峰值 using (Stream imageStreamSource = new FileStream(@"c:\temp\input\snow.jpg", FileMode.Op

我一直在编写一个程序集来处理一些基本的图像处理,遇到了一个我在解决问题时遇到的绊脚石

问题的关键是,当我创建一个新的
System.Windows.Media.Imaging.WriteableBitmap
时,进程的私有字节数跳到了令人难以置信的地步。 我的测试控制台应用程序有以下代码和几个断点,可以查看内存使用何时达到峰值

using (Stream imageStreamSource = new FileStream(@"c:\temp\input\snow.jpg", FileMode.Open, FileAccess.Read, FileShare.Read))
{
    BitmapImage bmpi = new BitmapImage();
    bmpi.BeginInit();
    bmpi.CreateOptions = BitmapCreateOptions.None;
    bmpi.StreamSource = imageStreamSource;
    bmpi.EndInit();
    var bmp = new WriteableBitmap(bmpi);
}
.EndInit()
调用结束时,内存使用量只有几百个字节,但一旦实例化了
WriteableBitmap
,内存就会跳到几百MB

我试图处理的图像不是世界上最大的(4134x2924),并且大小不到300KB。快速计算内存中表示32bpp所需的内存约为40MB。除非我遗漏了一些明显的东西,否则有些东西看起来是错的

(snow.jpg)

我已经阅读过旧版本Silverlight中WritableBitmap中可能存在的内存泄漏,但我使用的是.net 4.0,我还没有看到此版本中出现泄漏的报告


有没有人对此有什么见解或解决方案,因为它不能扩展到web进程在生产中消耗那么多内存的程度?

我猜想构造函数在初始化对象时必须执行一些转换,并且必须分配内存来完成这项工作。然后释放资源,但内存不会立即被垃圾回收。这是一个实际的问题,还是您只是担心屏幕上显示的内存使用率图表?我担心内存消耗,因为它将位于32位IIS工作进程中,该进程在内存使用率方面已经很热了。我已经看到,当IIS中的内存保护措施受到攻击时,工作进程完全崩溃(尽管存在其他问题),并且增加数百MB的使用量,即使在使用对象的生命周期时仅几秒钟,也会在生产中造成一些严重问题。我不认为获得工作进程的一般内存使用情况是现实的,所以我只考虑一个单独的进程,它感觉脏兮兮的。当加载多个图像时,内存消耗不会线性增加。在这种情况下,如果您担心方法的可伸缩性,那么这不应该是一个大问题。您是对的,内存使用不会随着负载的增加而增加,但我担心的是,单个映像负载可能会使工作进程中断,并导致生产web服务停机。最终,如果它只是按照
WriteableBitmap
应该的方式工作(这需要一些专家的输入或认真的思考),那么我要么离开了流程,要么使用不同的方式来处理图像,这将是一个耻辱,因为我写了这么多代码!)