2013-05-09 66 views
0

我在将SQL映像导出到文件时遇到问题。我首先初始化一个List。 MyRecord是一个具有GraphicName和Graphic属性的类。当我试图通过列表并将MyRecord.Graphic保存到磁盘时,我得到第一个机会例外类型'System.ObjectDisposedException'。我意识到这是因为当我将字节从数据库转换为图像时,我使用使用语句和MemoryStream。我不能使用using语句,它一切正常,但是我担心在多达6000条记录上的内存使用/内存泄漏。有没有另一种方法将字节转换为图像或者是否有更好的设计来完成此操作?在不使用MemoryStream的情况下将字节[]转换为图像

... prior code 
using (SqlDataReader reader = sqlCommand.ExecuteReader()) 
{ 
    while (reader.Read()) 
    { 
     MyRecord record = new MyRecord(); 
     record.GraphicId = reader["GRAPHIC_ID"].ToString(); 
     record.Graphic = !reader.IsDBNull(reader.GetOrdinal("IMAGE")) ? GetImage((byte[])reader["IMAGE"]) : null; 
     records.Add(record); 
    } 
... more code 

private Image GetImage(byte[] rawImage) 
{ 
    using (System.IO.MemoryStream ms = new System.IO.MemoryStream(rawImage)) 
    { 
     Image image = Image.FromStream(ms); 
     return image; 
    } 
} 
+0

你为什么不能保存'byte []'直接写入文件? – Oded 2013-05-09 19:32:08

+0

@Oded我可以,但图像得到显示,所以在某些时候我也需要图像。你的是重新设计的可能解决方案。 – jac 2013-05-09 20:45:06

回答

6

不应该使用using声明与将被传递到Image.FromStream流,为Image类是从此流基本责任。从documentation

您必须保持该流在图像的生命周期中打开。

只需更改您的代码:

private Image GetImage(byte[] rawImage) 
{ 
    var stream = new MemoryStream(rawImage); 
    return Image.FromStream(stream); 
} 

...但然后确保你处置您Image对象后。这将处理流,允许内存被垃圾收集。那么就不应该有任何内存泄漏 - 但是你需要确定你是否真的可以一次将所有6000张图像加载到内存中。

(如果不处置Image的对象,他们可能会在某个时候反正敲定 - 但它会更好确定性处理掉)

+0

我知道我不能使用using语句,但我希望得到一个答案,让我可以在列表中保留一个图像。我改变了设计以保存字节[],并为该类添加了一个GetAsImage方法。然后调用者负责处理图像。 – jac 2013-05-09 20:35:14

相关问题