如何解决c#中的内存不足异常

本文关键字:内存不足 异常 何解决 解决 | 更新日期: 2023-09-27 18:12:13

我正在开发一个Winforms应用程序。这段代码包含了将图像保存到SQL Server表的功能。但是,当我从表中返回二进制数据以显示图像时,有时会发生Out of memory异常。

这是我的代码转换图像之前保存。

openImage.Filter = "Image Files(*.jpg; *.jpeg; *.gif; *.bmp)|*.jpg; *.jpeg; *.gif; *.bmp";
if (openImage.ShowDialog() == DialogResult.OK)
{
    pictureBox1.Image = new Bitmap(openImage.FileName);         
    pictureBox1.SizeMode = PictureBoxSizeMode.CenterImage;      
    lblImgInfo.Text = openImage.FileName;
    FRM_ImageViewer imgver = new FRM_ImageViewer(openImage.FileName);
    imgver.Show();
    string strFn = openImage.FileName;
    FileInfo fiImage = new FileInfo(strFn);
    long  m_lImageFileLength =fiImage.Length;
    byte[] m_barrImg = new byte[Convert.ToInt32(m_lImageFileLength)];
    FileStream fs = new FileStream(strFn, FileMode.Open, FileAccess.Read, FileShare.Read);
    int iBytesRead = fs.Read(m_barrImg, 0,Convert.ToInt32(m_lImageFileLength));
    fs.Close();
}
这是我从数据库 检索图像的代码
// DTSelectedJobs is a DataTable  in csharp.
byte[] barrImg = (byte[])DTSelectedJobs.Rows[0].ItemArray[11];
string strfn = Convert.ToString(DateTime.Now.ToFileTime());
FileStream fs2 = new FileStream(strfn, FileMode.CreateNew, FileAccess.Write);
fs2.Write(barrImg, 0, barrImg.Length);
fs2.Flush();
fs2.Close();
FRM_ImageViewer imgvwr = new FRM_ImageViewer(strfn);
imgvwr.Show();

谁能给我一个建议如何找到错误?

如何解决c#中的内存不足异常

Bitmap继承自Image,这是Disposable,您需要处置您的位图

using(var bmp = new Bitmap(openImage.FileName))
{
    pictureBox1.Image = bmp;
}

DGibbs指出,您需要对FileStream

执行相同的操作。
using(var fs = new FileStream(strFn, FileMode.Open, FileAccess.Read,
                              FileShare.Read))
    int iBytesRead = fs.Read(m_barrImg, 0,Convert.ToInt32(m_lImageFileLength));

我不太熟悉winforms,所以请原谅我,但这对我来说是不正确的。

创建strfn:

string strfn = Convert.ToString(DateTime.Now.ToFileTime());

然后初始化一个图像查看器…日期/时间字符串?

FRM_ImageViewer imgvwr = new FRM_ImageViewer(strfn);

似乎barrImg是什么应该在这里?

同样,FileStream实现了IDisposable接口,所以应该理想地包装在using块中:

using(FileStream fs2 = new FileStream(strfn, FileMode.CreateNew, FileAccess.Write))
{
    fs2.Write(barrImg, 0, barrImg.Length);
    FRM_ImageViewer imgvwr = new FRM_ImageViewer(strfn);
    imgvwr.Show();
}

这个问题已经问了快一年了,但还是让我分享一下我的想法,因为还没有答案

由于没有足够的内存,抛出了内存不足异常可用于您的应用程序或您的应用程序使用太多内存不足

我将检查以下内容以找出应用程序使用太多内存的原因

1)确保表只返回所需的数据。因为图像的大小很大。如果你的数据库返回一个大的结果,那么结果集可能会使用几个MB的内存。

假设您正在尝试查看保存在数据库中的图像,如果您正在显示n图像,则查询特定的记录。

2)确保你正在处理所有的一次性对象,如Image, Bitmap,Stream, FileStream, Pen等,因为它可能会导致应用程序中的内存泄漏 3)使用内存分析器检查应用程序中的内存泄漏