是否可以使用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语句,这样该流ISN不会处理,那么应用程序不会在XP上崩溃。但是我现在有一堆悬挂的“孤儿”流 - 图像存储在命令类中,这些图像在处理它们时正确处理图像,但原始流不是。
我检查了FromStream
的文档,它确认流需要保持打开状态。但是,为什么在Windows 7开发系统上没有崩溃和烧毁,这是一个谜!
我真的不希望这个流挂起来,我当然不希望存储对这个流以及图像的引用,所以我可以稍后处理它。我只需要一次这样的流,所以我想摆脱它:)
是否有可能创建图像,然后杀死那里的流?
通过在'System.Drawing'中的'OutOfMemoryException'通常意味着* GDI +中的一般错误*。这是因为[历史](http://stackoverflow.com/questions/2610416/is-there-a-reason-image-fromfile-throws-an-outofmemoryexception-for-an-invalid-im)到非管理错误代码的映射。 – 2010-10-02 11:35:49
如果您传递给Image.FromStream的流不可查找,则可以安全地关闭流。但这是无证的行为,所以请自担风险。 – user2452157 2016-06-17 07:41:28