奇怪的C#内存泄漏使用GDI

时间:2012-03-23 16:38:49

标签: c# wpf

this.Dispatcher.Invoke(
            new Action(() =>
            {
                if (currentImage != null)
                {
                    currentImage.Dispose();
                    currentImage = null;
                }
                this.currentImage = render.render(value);
                this.mainImage.Source =
                    System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                        currentImage.GetHbitmap(),
                        IntPtr.Zero,
                        Int32Rect.Empty,
                        System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
            }));

注意this.mainImage是WPF中的Image控制器。 当我执行句子“this.mainImage.Source = XXXX”时,我发现有一些内存泄漏 我发现没有办法释放this.mainImage.Source

所拥有的内存

2 个答案:

答案 0 :(得分:2)

看起来您需要在从currentImage.GetHbitmap()检索的hbitmap上调用DeleteObject。 Here's the MSDN link for GetHbitmap.

答案 1 :(得分:0)

不幸的是,没有直接的方式来释放由Image.Source分配的资源,而不是我所知道的。但是有不同的方法可以避免它,尽可能

当您知道不会操纵该元素时,可能的解决方案之一是将其设为Freezable。在这种情况下,WPF框架避免跟踪该对象上的事件,因为您将其声明为“只读”。因此,您可以显着提高应用程序的性能。

旧的,但仍然是好文章:

Finding Memory Leaks in WPF-based applications