我有一些代码
MemoryStream ms = new MemoryStream();
...
return Image.FromStream(ms);
它以非常折衷的方式失败,因为Image对象没有对流进行引用,因此如果GC启动导致GDI +错误,它就会被处理掉。
如何解决此问题(不将流保存到磁盘或更改我的方法sigs)?
答案 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
并使用终结器来显示它是否真的被收集(好,最终在至少)。