【发布时间】:2014-09-30 23:15:34
【问题描述】:
我有这个函数,它在函数中返回一个图像,该图像是使用 Image.FromStream 方法创建的 根据MSDN:
您必须在图像的生命周期内保持流打开
所以我没有关闭流(如果我关闭了流,则从返回的图像对象中抛出 GDI+ 异常)。我的问题是,当 Image.Dispose() 在返回的图像上的其他地方调用时,流是否会关闭/处理
public static Image GetImage(byte[] buffer, int offset, int count)
{
var memoryStream = new MemoryStream(buffer, offset, count);
return Image.FromStream(memoryStream);
}
正如其中一个答案所建议的那样,使用不是可行的方法,因为它会引发异常:
public static Image GetImage(byte[] buffer, int offset, int count)
{
using(var memoryStream = new MemoryStream(buffer, offset, count))
{
return Image.FromStream(memoryStream);
}
}
public static void Main()
{
var image = GetImage(args);
image.Save(path); <-- Throws exception
}
- 根据某些人明确处理/关闭 MemoryStream 是没有必要的,因为它不使用任何非托管资源,其他人则说相反的话,所以这是一种两难境地.
- Image.Dispose 方法不会释放创建 Image 的流
- Image 类不包含对传递给 Image.FromStream 方法的 Stream 的任何引用,因此该流最终将被 GC 收集...?因此 Image.Save 方法中的异常
- 返回一个包装类,其中包含对流的引用和由它创建的图像,从而使我们能够dispose它们...?或者干脆使用 Tag 属性来保持对父流的引用...?
- 这个问题似乎只在使用 MemoryStream 时发生。如果图像是从 ConnectStream 创建的,即使父流被释放,也不会发生 bad。
【问题讨论】:
-
也许提供一些细节可以帮助我们了解您想要实现的目标。
-
看到这个问题(可能重复)stackoverflow.com/questions/336387/…