不使用MemoryStream将byte []转换为Image

jac*_*jac 0 c#

我在将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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

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

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

只需将您的代码更改为:

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

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

(如果你不处理这些Image物品,它们很可能在某些时候最终确定 - 但最好是确定性地处理它们.)