【发布时间】:2011-04-20 05:10:33
【问题描述】:
是否可以使用 System.Drawing.Image 的 FromStream 方法而不必在图像的生命周期内保持流打开?
我有一个应用程序,它使用Image.FromStream 和Assembly.GetManifestResourceStream 的组合从资源文件中加载一堆工具栏图形。
我遇到的问题是,虽然这在 Windows 7 上运行良好,但在 Windows XP 上,如果链接到这些图像之一的用户界面元素被禁用,应用程序会崩溃。在 Windows 7 上,图像以灰度呈现。在 XP 上,它会因内存不足异常而崩溃。
经过大量的拉扯后,我终于将其追溯到图像的初始加载。当然,如果我创建了任何实现 IDisposable 的对象,并且在同一方法中也被销毁,我将其包装在 using 语句中,例如
using (Stream resourceStream = assembly.GetManifestResourceStream(resourceName))
{
image = Image.FromStream(resourceStream);
}
如果我删除 using 语句以便不释放流,则应用程序不再在 XP 上崩溃。但是我现在有一堆“孤儿”流挂着 - 图像存储在命令类中,当它们自己被处理时,它们会正确处理图像,但原始流不是。
我检查了FromStream 的文档,它确认流需要保持打开状态。然而,为什么它没有在 Windows 7 开发系统上崩溃和烧毁是一个谜!
我真的不希望这个流一直存在,我当然也不想存储对这个流的引用以及图像,以便我以后可以处理它。我只需要那个流一次,所以我想摆脱它:)
是否可以创建图像然后在那里杀死流?
【问题讨论】:
-
顺便说一下,
System.Drawing中的OutOfMemoryException通常意味着 GDI+ 中的一般错误。造成这种情况的原因是historic 并且是由于非托管错误代码的映射。 -
如果您传递给 Image.FromStream 的流是不可搜索的,您可以安全地关闭流。但这是未记录的行为,因此使用风险自负。
标签: c# image stream out-of-memory