C# Image.FromStream不包含对基础流的引用

C# Image.FromStream不包含对基础流的引用,c#,.net,image,C#,.net,Image,我有一些代码 MemoryStream ms = new MemoryStream(); ... return Image.FromStream(ms); 它以非常折衷的方式失败,因为Image对象不包含对流的引用,因此如果GC启动导致GDI+错误,它可以被释放 我如何解决这个问题(不将流保存到磁盘,或更改我的方法sigs) 如果不稍微更改代码,就没有办法做到这一点。委员会: 你必须保持溪流通畅,以备不时之需 图像的生存期 也就是说,您必须确保在图像访问流时,流是打开的。看起来(通过反射器查看

我有一些代码

MemoryStream ms = new MemoryStream();
...
return Image.FromStream(ms);
它以非常折衷的方式失败,因为Image对象不包含对流的引用,因此如果GC启动导致GDI+错误,它可以被释放


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

如果不稍微更改代码,就没有办法做到这一点。委员会:

你必须保持溪流通畅,以备不时之需 图像的生存期

也就是说,您必须确保在图像访问流时,流是打开的。看起来(通过反射器查看)FromImage方法实际上并没有导致Image实例保留对从中加载图像的流的引用


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

这在我看来是极不可能的-它几乎会对
image.FromStream
的任何使用造成问题

在我看来,更有可能是有什么东西正在处理你的
内存流
,而它不应该这样做


你能提供一个简短但完整的程序来演示这个问题吗?强制垃圾收集应该使其相对容易复制-您甚至可以使用终结器创建自己的类,该类派生自
MemoryStream
,以显示是否确实在收集垃圾(好吧,至少是终结的)。

我不明白。如果图像要求流处于打开状态,那么它必须包含对它的引用,对吗?@Issac Cambron:是的,这很好,但它指的是流处于打开状态,而不是引用有效。为此,如果您正在传递图像,但无法控制图像何时关闭(或者,当图像仍然需要它时,您自己正在其他地方关闭它)。我正在更新答案以反映这一点。@Sam Saffron:如果你克隆了图像,我认为你仍然需要保留流。克隆方法的文档不是很明确,它生成了一个“精确副本”,可以用多种不同的方式进行解释。我不知道克隆是否也需要打开原始流。@Sam:
read
如果流中有更多数据,则应始终大于0,但它很容易小于
buffer.Length
,即使之后流中还有更多数据。是的,结果都是这样的: