C# 如何解决C语言中的内存不足异常#
我正在开发一个Winforms应用程序。此代码包含将图像保存到SQL Server表的命令。但有时,当我从表中返回二进制数据以显示图像时,会发生内存不足的异常 这是我保存前转换图像的代码C# 如何解决C语言中的内存不足异常#,c#,.net,winforms,C#,.net,Winforms,我正在开发一个Winforms应用程序。此代码包含将图像保存到SQL Server表的命令。但有时,当我从表中返回二进制数据以显示图像时,会发生内存不足的异常 这是我保存前转换图像的代码 openImage.Filter = "Image Files(*.jpg; *.jpeg; *.gif; *.bmp)|*.jpg; *.jpeg; *.gif; *.bmp"; if (openImage.ShowDialog() == DialogResult.OK) { pictureBox1
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();
有人能给我一个如何查找错误的建议吗?
位图
继承自一次性位图,您需要处理位图
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) 确保您正在处理所有一次性对象,如图像、位图、流、文件流、笔等,因为这可能会导致应用程序内存泄漏
3) 使用内存探查器检查应用程序中是否存在内存泄漏。
位图继承自可一次性使用的位图,您需要处理位图。@Sayse和文件流此代码包含它以将图像保存到sql server表。
哇,到此为止。永远不要将图像保存到数据库!!异常发生的具体位置(哪一行)?您是否正在使用m_barrImg
?另外,假设FRM_ImageViewer
打开该文件,并结合为pictureBox1
创建的位图,那么内存中将有三个相同图像的副本。你到底在转换什么?虽然我同意,但这能回答问题吗?OP说他在从数据库读取图像时出错。@DavidG-任何内存泄漏都会导致错误,第二个代码段中也有一个文件流,应该会得到相同的处理。我不会说这是内存泄漏(我假设GC最终会清理这些内容),尽管内存效率很低。我关心的是FRM\u ImageViewer
构造函数中发生的事情。