HCL*_*HCL 6 wpf performance idisposable memory-profiling imagesource
我用来从资源中StreamResourceInfo.Stream获取BitmapImage资源.使用后流Close和Dispose流是否正确?我问,因为在内存分析器中,如果我这样做,我会收到错误.内存分析器表示已处理的实例尚未进行GCed.   
如果我在网上看,我只能在这个主题上找到这篇文章.在这篇文章中,回应的人说,这是有意义的处置.但是,如果我看一下情况和影响,我认为这是不对的.有人知道什么是正确的行动?
附加信息:在我看过的msdn示例中,它们不是Dispose或Close.
编辑
 
感谢Rick Sladkeys回答,我找到了解决方案:我分配StreamResourceInfo.Stream给了StreamSource-property BitmapImage.在msdn中写道:
如果要在创建BitmapImage后关闭流,请将CacheOption属性设置为BitmapCacheOption.OnLoad.默认的OnDemand缓存选项保留对流的访问,直到需要位图,并且清理由垃圾收集器处理.
这意味着,BitmapImage获取流的所有权.这就是为什么如果我手动关闭/处理流,内存分析器会显示错误:Bitmap将保存对流的引用(BitmapCacheOption OnDemand),因此只要BitmapImage有效,GC就不会释放它,但是流已经明确表示处置.在这个具体的例子中,处置是一个糟糕的想法.
为了完整性,我还在msdn中查看了TextRange.Load调用上述链接的示例.因为Load,相反,Load不占用所有权,因此必须在完成后关闭/处理流.
Ric*_*key 10
混淆,我同意这是令人困惑的,来自流的所有权的微妙但关键的概念.在MSDN示例中,您可以将它们视为"看,不Dispose,不Close,所以我不应该这样做?"
但简单的答案是,有人必须负责关闭流.您可能正在调用的API:
Application.GetResourceStream返回一个StreamResourceInfo是流和URL的原始容器.显然,StreamResourceInfo不拥有流.因此,当你打电话给Application.GetResourceStream 你现在拥有其中包含的流时StreamResourceInfo,如果你没有做任何其他事情,你将负责关闭它.该ApplicationAPI通过返回它的值给我们转移流的所有权从本身给我们.
现在,当您将流传递给另一个实体时,会出现令人困惑的部分.我们来看一个MSDN示例:
// Navigate to xaml page
Uri uri = new Uri("/PageResourceFile.xaml", UriKind.Relative);
StreamResourceInfo info = Application.GetResourceStream(uri);
System.Windows.Markup.XamlReader reader = new System.Windows.Markup.XamlReader();
Page page = (Page)reader.LoadAsync(info.Stream);
this.pageFrame.Content = page;
现在在这个例子中没有Dispose,没有Close.但有是一个所有权转移的物流从我们(主叫)的XamlReader实例.流不再是我们的责任; 我们已将所有权转让给其他人.事实上,当它完成流时XamlReader会调用Close.一个谜团解决了.
这是一个问题的原因是所有权的概念通常隐含在文档中,我们应该"只是想出来".但愿只是重新考虑日概念所有权和事实,即它是转让会更容易感到舒适不调用Close与安全的新主人会.即使他们不这样做,也不再是我们的问题了!
| 归档时间: | 
 | 
| 查看次数: | 1140 次 | 
| 最近记录: |