Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何解决C语言中的内存不足异常#_C#_.net_Winforms - Fatal编程技术网

C# 如何解决C语言中的内存不足异常#

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

我正在开发一个Winforms应用程序。此代码包含将图像保存到SQL Server表的命令。但有时,当我从表中返回二进制数据以显示图像时,会发生内存不足的异常

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

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
构造函数中发生的事情。