Image.FromStream不保存对基础流的引用

时间:2010-02-26 06:34:19

标签: c# .net image

我有一些代码

MemoryStream ms = new MemoryStream();
...
return Image.FromStream(ms);

它以非常折衷的方式失败,因为Image对象没有对流进行引用,因此如果GC启动导致GDI +错误,它就会被处理掉。

如何解决此问题(不将流保存到磁盘或更改我的方法sigs)?

2 个答案:

答案 0 :(得分:1)

如果不稍微更改代码,就无法做到这一点。 Remarks section for the documentation for the static FromStream method on the Image class states

  

你必须保持流开放   图像的生命周期。

话虽这么说,你必须确保在Image访问Stream时,流是开放的。它也会出现(通过Reflector查看)FromImage方法实际上不会导致Image实例保持对从中加载图像的Stream的引用。

话虽这么说,你以某种方式将图像和MemoryStream(或Stream)链接在一起,这样它就不会得到GCed。如果没有真正保留图像的“所有权”(它被传递),那么我建议你创建一个数据结构,它将保存对Image和Stream的引用并将两者串联传递。

答案 1 :(得分:1)

这对我来说似乎不太可能 - 几乎任何Image.FromStream的使用都会导致问题。

我似乎更有可能处理你的MemoryStream,而不应该这样做。

你能提供一个简短但完整的程序来证明这个问题吗?强制垃圾收集应该使它相对容易重现 - 你甚至可以创建自己的类来自MemoryStream并使用终结器来显示它是否真的收集(好,最终在至少)。