请注意,这是在,WPF/C#而不是在.net2.0 Winforms
我有一个ListBox,其中包含say的对象Class X.类X包含一个BitmapSource显示在列表框中的对象,因此它显示类似于[Image] [Text]
这是通过使用CreateBitmapSourceFromHBitmap- 注意我也打电话DeleteHBitmap删除HBitmap此调用期间的句柄,这是众所周知的从我在谷歌/等上看到的帖子做
我有一个树,其中包含ListBox每个TreeViewItem- 通常树有几个项目加载.用户可以将这些图像拖放到不同的TreeViewItem中.要处理这些操作,我手动调用操作:
<code>
ItemCollection.RemoveAt
</code>
<code>
ItemCollection.Insert
</code>
Run Code Online (Sandbox Code Playgroud)
以move从列表框项集合图像,注意,当我插入我创建一个新的Class X对象插入到ListBox项目集合
我注意到,在5-10分钟的一致拖放空间中,我多次调用此类操作会得到一致的内存泄漏.
我的问题是:
我正在处理BitmapSource正确的移动吗?有什么我正在做的事情导致图像没有被完全删除ItemCollection?
或者有什么根本我错过了?
ClassX 中保存图像的变量的定义是什么???问题可能在于,您正在创建一个新的 ClassX,而旧的 ClassX 不会被 GC 删除,从而导致头部有两个不同的 ClassX 实例。
由于您使用的是非托管代码 (CreateBitmapSourceFromHBitmap),您应该检查是否正确调用了所有 Finalize 方法(尽管可能关闭或处置),并且没有可以指向 ClassX 的静态引用。
请记住,如果未删除 ClassX,则 GC 生成的图中将可以访问 Bitmap 实例,从而不会将其从堆中删除。
我建议使用 perfmon 并添加 .Net 内存对象来查看是否有任何对象在最终确定或固定对象中幸存下来,这些是您可能对内存泄漏感兴趣的对象。
我希望它有帮助:P,但是如果你把 ClassX 的代码放在里面会更好。
| 归档时间: |
|
| 查看次数: |
1194 次 |
| 最近记录: |