微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

处置StreamResourceInfo.Stream

如何解决处置StreamResourceInfo.Stream

| 我使用
StreamResourceInfo.Stream
从资源中获取
BitmapImage
。使用流后,将其“ 2”和“ 3”流正确吗? 我问是因为在内存探查器中,如果执行此操作会出现错误。内存探查器表示尚未处理已处置的实例。 如果在网上浏览,我只能找到该主题的帖子。回应者在这文章中说,处置是不够的。但是,如果我看一下情况和影响,我认为这是不对的。有人知道正确的举动是什么吗? 附加信息:在我所看到的msdn示例中,它们没有“处置”或“关闭”。 编辑 感谢Rick Sladkeys的回答,我找到了解决方案: 我为
BitmapImage
StreamSource
属性分配
StreamResourceInfo.Stream
。在msdn中写道: 如果要在创建BitmapImage之后关闭流,请将CacheOption属性设置为BitmapCacheOption.OnLoad。认的ondemand缓存选项将保留对流的访问,直到需要位图为止,并且清理由垃圾收集器处理。 这意味着,
BitmapImage
将获得流的所有权。这就是为什么如果我手动关闭/处置流,内存分析器会显示错误的原因:位图将保留对流的引用(BitmapCacheOption ondemand),因此,只要BitmapImage有效,GC就不会释放它,但是流已被明确处置。在此特定示例中,处置是一个不好的主意。 为了完整起见,我还在msdn中查看了上面链接的示例,其中称为“ 8”。对于“ 9”,情况恰恰相反,“ 9”没有所有权,因此必须在完成后关闭/处置流。     

解决方法

混乱(我同意是混乱的)来自流所有权的微妙但关键的概念。在MSDN示例中,您可以这样看它们:“看,没有
Dispose
,没有
Close
,所以我不应该这样做吗?” 但是简单的答案是必须由某人负责关闭流。您可能正在调用的API:
Application.GetResourceStream
返回
StreamResourceInfo
,它是流和URL的原始容器。显然,
StreamResourceInfo
不拥有视频流。因此,当您调用
Application.GetResourceStream
时,您现在拥有该
StreamResourceInfo
中包含的流,并且,如果您对它没有做任何其他事情,您将负责关闭它。
Application
API通过将流的所有权作为值返回给我们,将流的所有权从其自身转移给了我们。 现在,当您将流传递给另一个实体时,就会出现令人困惑的部分。让我们以一个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
确实会调用ѭ2call。一个谜解决了。 之所以如此有问题,是因为所有权概念通常在文档中是隐含的,我们应该“弄清楚”。希望重新审视所有权概念,并且所有权可以转让的事实将使之更容易放心,不要以新所有者将提供的保证金致电comfortable2。即使他们不这样做,也不再是我们的问题!     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?