我在将SQL映像导出到文件时遇到问题。我首先初始化一个List。 MyRecord是一个具有GraphicName和Graphic属性的类。当我尝试浏览列表并将MyRecord.Graphic保存到磁盘时,我得到了类型为'System.ObjectDisposedException'的第一次机会异常。我意识到这是因为当我将数据库中的字节转换为Image时,我在MemoryStream中使用了 using 语句。我不能使用using语句,但一切正常,但我担心多达6,000条记录的内存使用/内存泄漏。是否有另一种方法将字节转换为图像,还是有更好的设计来做到这一点?
... 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 :(得分:6)
你不应该使用带有将传递给using
的流的Image.FromStream
语句,因为Image
类基本上负责流从那时起。来自documentation:
您必须在图像的生命周期内保持流打开。
只需将您的代码更改为:
private Image GetImage(byte[] rawImage)
{
var stream = new MemoryStream(rawImage);
return Image.FromStream(stream);
}
...但请确保稍后丢弃Image
个对象。这将处理流,允许内存被垃圾收集。然后不应该有任何内存泄漏 - 但你需要弄清楚你是否真的可以一次将所有6000个图像加载到内存中。
(如果你没有处置Image
个对象,它们可能会在某个时候最终确定 - 但最好是确定性地处理它们。)