WPF/C#中的内存泄漏问题

6
请注意,此操作是在 WPF/C# 中完成的,而不是在 .net2.0Winforms 中。
我有一个 ListBox,其中包含一些 Class X 对象。Class X 包含一个 BitmapSource 对象,该对象在列表框中显示,因此它显示为类似于 [Image] [Text] 的形式。
这是通过使用 CreateBitmapSourceFromHBitmap 加载的 - 请注意,我在此调用期间调用 DeleteHBitmap 来删除 HBitmap 的句柄,这是众所周知的,在 Google/等网站上可以看到相关帖子。
我有一个树,其中每个 TreeViewItem 都包含一个上述提到的 ListBox - 通常树中加载了多个项目。用户可以将这些图像拖放到不同的 TreeViewItems 中。为了处理这些操作,我手动调用以下操作:
<code>
    ItemCollection.RemoveAt
</code>

<code>
    ItemCollection.Insert
</code>

要将图像从ListBox项集合中移动,请注意在插入时我创建了一个新的Class X对象来插入到ListBox项集合中。

我注意到当我多次调用此操作时会出现内存泄漏,持续拖放5-10分钟。

我的问题是:

我是否正确处理了BitmapSource的移动?我是否做了什么导致图像没有完全从ItemCollection中删除?

还是我错过了一些基本的东西?

1个回答

1

你的 ClassX 中保存图像的变量的定义是什么?可能问题在于你正在创建一个新的 ClassX,旧的 ClassX 没有被 GC 删除,导致头部有两个不同的 ClassX 实例。

由于你正在使用非托管代码(CreateBitmapSourceFromHBitmap),应该检查是否正确调用了所有的 finalize 方法(通过 close 或 dispose),以及是否存在可能指向你的 ClassX 的静态引用。

请记住,如果你的 ClassX 没有被移除,则 Bitmap 实例将在 GC 创建的图形中可达,从而使其无法从堆中删除。

我建议使用 perfmon 并添加 .Net 内存对象,以查看是否有任何 survived finalize 或 pinned object,这些对象可能涉及内存泄漏。

希望能有所帮助 :P,但如果你能提供 ClassX 的代码将更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接