- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用StreamResourceInfo.Stream
从资源中获取BitmapImage
。使用流后 Close
和 Dispose
是否正确?我问这个问题是因为在内存分析器中,如果这样做我会收到错误。内存分析器表示已处置的实例尚未进行 GC。
如果我在网上查找,我只能找到 this发布到该主题。在这篇文章中,回复者说,处理是有意义的。但从当时的情况和效果来看,我认为这是不对的。有人知道什么是正确的行动吗?
附加信息:在我见过的 msdn 示例中,它们没有 Dispose 或 Close。
编辑
感谢 Rick Sladkeys 的回答,我找到了解决方案:我将 StreamResourceInfo.Stream 分配给 BitmapImage 的 StreamSource 属性。在 msdn写的是:
如果您希望在创建 BitmapImage 后关闭流,请将 CacheOption 属性设置为 BitmapCacheOption.OnLoad。默认的 OnDemand 缓存选项保留对流的访问,直到需要位图为止,并由垃圾收集器处理清理工作。
这意味着,BitmapImage
取得了流的所有权。这就是为什么如果我手动关闭/处置流,内存分析器会显示错误:位图将保留对流的引用(BitmapCacheOption OnDemand),因此只要 BitmapImage 有效,GC 就不会释放它,但流已经明确处置。在这个具体示例中,处置是一个坏主意。
为了完整起见,我还在 msdn 中查找了调用 TextRange.Load
的上述链接的示例。对于 Load
来说,情况正好相反,Load
不获取所有权,因此流必须在完成后关闭/处置。
最佳答案
这种困惑,我同意这令人困惑,来自于流所有权这一微妙但关键的概念。在 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
在处理完流后确实会调用 Close
。一个谜团解开了。
这个问题之所以如此严重,是因为所有权的概念通常隐含在文档中,而我们应该“弄清楚它”。希望只是重新审视所有权的概念以及它是可转让的这一事实,将使您更容易感到不调用Close
与安全性新主人将会。即使他们不这样做,这也不再是我们的问题!
关于wpf - 处置 StreamResourceInfo.Stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6143899/
释放 MKMapView 后,我遇到了奇怪的(?)崩溃。 MKMapView 是我的 View Controller 中的 subview ,在我从导航堆栈中删除该 View 并释放它后,应用程序崩溃
我正在尝试使用以下方法处理我的 JFrame: private void killJFrame(JFrame jFrame) { SwingUtilities.invokeLater(() -
我用的是asp net 4.5。 我有 Marker.aspx 页面和页面 Marker.aspx.cs 背后的代码。每当回发发生时,Page_Load 函数将在代码隐藏中触发并创建 GeoMarku
在 C# 中,如 Documentation 中所述, 和 this nice post接受的答案,声明类不继承其父类的析构函数。 问题:如果我想确保释放基类的私有(private)元素,在所有子类中
我想知道是否有人知道如何知道 InheritedWidget 何时被释放? 这个问题的原因是我正在做一些实验,并且我正在使用 InheritedWidget 作为 BLoC 的提供者。此 BLoC 在
如果应用程序意外关闭,如何安全地处理 ReportViewer 对象 Public Shared rv As New Microsoft.Reporting.WinForms.ReportViewe
有没有办法销毁 WebView 实例?如果页面加载,并说视频开始播放,我希望能够,当我隐藏 WebView 时,基本上可以销毁它,或者至少重置它。 我知道我可以听 visibleProperty 并执
在总体情况下,Close 方法在语义上只是更改对象的状态,而该对象可以使用 Open 方法无限期地再次更改。 另一方面,IDisposable.Dispose() 方法的语义将对象置于无法撤消的状态。
我使用StreamResourceInfo.Stream从资源中获取BitmapImage。使用流后 Close 和 Dispose 是否正确?我问这个问题是因为在内存分析器中,如果这样做我会收到错误
我正在编写一个程序,显示在屏幕上移动的图像,但是对于作业,我必须使用drawImage方法。我创建一个名为turtle的新图像,然后在一个点绘制该图像,然后在稍后的时间点再次绘制它,但是,第一个绘制的
这个问题在这里已经有了答案: Do you need to dispose of objects and set them to null? (12 个答案) 关闭 4 年前。 我在我的代码中使用
我有一个使用 Entity Framework 的 MVC 3 应用程序,我在其中设置了自定义角色提供程序。 我的角色提供者依赖于一个存储库,而该存储库依赖于 DbContext。 我在应用程序启动方
我正在尝试创建处理整个 BST 的迭代方法。 通过函数 insert_nodes 插入节点后,我没有得到预期的输出。 它应该打印如下内容:left,right, #nr #nr #nr 对于数字 5,
我正在使用 MemoryAppender 来读取单元测试中的日志消息。 我按以下方式使用 BasicConfigurator: class LogVerifier { pr
谁能给出一个完整的例子来说明 qooxdoo 1.6 中的 dispose 和 destruct 是如何工作的? ,我在 qooxdoo 演示或文档中找不到任何好的示例。 谢谢你的建议。 最佳答案 处
我在处理屏幕时遇到问题。当我尝试处置 OrthogonalTiledMapRenderer 时,收到此错误消息。我在网上查了一下,没有发现任何其他这样的例子或发生这种情况的情况。 Exception
我正在使用匿名方法来处理 COM 对象中的事件。程序终止后,我在匿名方法中使用的资源似乎没有被“正确关闭”,因为我正在观看的每个资源都会出现第一次机会异常 (InvalidComObjectExcep
我有一个用 C# 编写的方法,它接受一个包含 XML 文档的字符串和一个 XSD 流数组。字符串文档根据 XSD 进行验证: private static XmlValidationResult Va
有没有办法“清理”您创建的对象和其他变量?还是它们会自动处理掉,或者我的整个概念都错了?这样做的正确方法是什么?我尽量避免 GC。 最佳答案 在没有内存管理的 GC 语言中,唯一的清理方法是 GC 。
当您在 ASP.Net 框架中创建和使用 Web 服务代理类时,该类最终继承自 Component,后者实现了 IDisposable。 我从未在网上看到过人们处理 Web 代理类的例子,但想知道是否
我是一名优秀的程序员,十分优秀!