C# 更改图像时需要从上一个图像中释放内存

C# 更改图像时需要从上一个图像中释放内存,c#,wpf,C#,Wpf,下面是垃圾收集器每三次加载一个映像就删除一个映像的代码,最后两个映像驻留在内存中。这对于大型图像非常关键,并且会定期导致“OutOfMemoryException” 您可以使用诸如和之类的工具来查看流程是否在特定文件上保留文件句柄,并确定代码的确切当前行为 我建议使用和关键字。正如所说,“文件是访问非托管资源的托管类型的示例……using语句以正确的方式调用对象上的Dispose方法” 希望我能帮忙 你确定没有对它的引用吗?如果没有更深入的理解,我猜有些代码可能只映射到com对象包装器,它会打

下面是垃圾收集器每三次加载一个映像就删除一个映像的代码,最后两个映像驻留在内存中。这对于大型图像非常关键,并且会定期导致“OutOfMemoryException”

您可以使用诸如和之类的工具来查看流程是否在特定文件上保留文件句柄,并确定代码的确切当前行为

我建议使用
关键字。正如所说,“文件是访问非托管资源的托管类型的示例……using语句以正确的方式调用对象上的Dispose方法”


希望我能帮忙

你确定没有对它的引用吗?如果没有更深入的理解,我猜有些代码可能只映射到com对象包装器,它会打开一个单独的线程,因此不会被垃圾收集。正确使用dispose可能会解决您的问题。要让GC做您想做的事情,首先要做的就是让它自己做。我怀疑对方付费电话除了促进这一代人和什么是img之外,并没有做任何事情,我看不到有人试图在这里释放任何东西,甚至管理它的生命周期。请先运行你的应用程序,然后再假设什么在使用你的内存。您可能是对的,但是有经验证据会大大加快速度。为什么不使用构造函数并将图像路径作为URI传递?非常感谢您的建议。但我无法解决这个问题。使用“using”在他的情况下,我不能(可能是由于缺乏经验)以及我的情况下的具体和PerfView。我很乐意提供任何解决此类问题的实际示例=)您在Process Explorer中看到任何打开的句柄吗?您是否定义了手柄何时保持打开状态以及何时不保持打开状态?当文件保持打开状态(不关闭
或其他什么)时,是否会发生任何不同的情况?当您关闭应用程序时,句柄是否空闲?
private void map()
        {            
            GC.Collect();
            GC.WaitForPendingFinalizers();            
            byte[] buffer = System.IO.File.ReadAllBytes(path);
            MemoryStream ms = new MemoryStream(buffer); 
            BitmapImage bitmap33 = new BitmapImage();
            bitmap33.BeginInit();           
            bitmap33.StreamSource = ms;
            bitmap33.EndInit();
            bitmap33.Freeze();
            img.Source = bitmap33;  
        }