0

我在将 SQL 图像导出到文件时遇到问题。我首先初始化一个List。MyRecord 是一个具有 GraphicName 和 Graphic 属性的类。当我尝试浏览列表并将 MyRecord.Graphic 保存到磁盘时,我得到了“System.ObjectDisposedException”类型的第一次机会异常。我意识到这是因为当我将字节从数据库转换为图像时,我使用了带有 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;
    }
}
4

1 回答 1

6

不应using语句与将传递给的流一起使用Image.FromStream,因为Image从那时起,该类基本上负责该流。从文档中:

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

只需将您的代码更改为:

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

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

(如果您不处置这些Image对象,它们很可能在某个时候最终确定 - 但最好确定性地处置它们。)

于 2013-05-09T19:31:47.817 回答