我使用
如果我在网上搜索,只能找到关于此主题的这篇帖子。在这篇帖子中,回答者说,释放是有意义的。但是,如果我看看情况和效果,我不认为这是正确的。有人知道正确的操作吗? 附加信息:在我看过的msdn示例中,他们没有Dispose或Close。
编辑 感谢Rick Sladkeys的答案,我找到了解决方案: 我将
将CacheOption属性设置为BitmapCacheOption.OnLoad,如果您希望在创建BitmapImage之后关闭流。默认的OnDemand缓存选项保留对流的访问,直到需要位图,垃圾回收由垃圾回收器处理。
这意味着
StreamResourceInfo.Stream
从资源中获取 BitmapImage
。在使用后关闭和释放流是否正确?我问这个问题是因为在内存分析器中,如果我这样做会出现错误。内存分析器显示已释放的实例未被GC回收。如果我在网上搜索,只能找到关于此主题的这篇帖子。在这篇帖子中,回答者说,释放是有意义的。但是,如果我看看情况和效果,我不认为这是正确的。有人知道正确的操作吗? 附加信息:在我看过的msdn示例中,他们没有Dispose或Close。
编辑 感谢Rick Sladkeys的答案,我找到了解决方案: 我将
StreamResourceInfo.Stream
分配给BitmapImage
的StreamSource
属性。在msdn中写道:将CacheOption属性设置为BitmapCacheOption.OnLoad,如果您希望在创建BitmapImage之后关闭流。默认的OnDemand缓存选项保留对流的访问,直到需要位图,垃圾回收由垃圾回收器处理。
这意味着
BitmapImage
拥有该流的所有权。这就是为什么内存分析器会显示错误,如果我手动关闭/释放流:位图将持有对流的引用(BitmapCacheOption OnDemand),因此只要BitmapImage有效,GC就不会释放它,但流已经被显式释放。在这个特定的例子中,释放是一个坏主意。
为了完整起见,我还查看了上面链接的示例中调用TextRange.Load
的msdn。对于Load
,情况相反,Load
不拥有所有权,因此必须在完成后关闭/释放流。
Dispose
会在内部调用Close
。(或者实际上通常是相反的) - Albin Sunnanbo