我的C#程序运行一下就出现内存不足的错误,C#不是自己处理内存的吗?

时间:2022-08-29 09:20:37
我只是在 Form 中放了一些控件,其中有一个打开文件对话框,运行时打开多个gif文件画在一个 panel 上,就出现这个错误

34 个解决方案

#1


本人初用 C# 请高手指点一二
以提高本人对学 C# 的积极性
不胜感激!

#2


有多少人在线?怎不见有高手回答问题?

#3


相关代码如下:

private void button1_Click(object sender, System.EventArgs e)
{
openFileDialog1.ShowDialog();
}

private void openFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
FileNames = openFileDialog1.FileNames;
panel7.Invalidate();
}

private void panel7_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
if (FileNames == null) 
return;
if (FileNames.Length == 0)
return;

Graphics graphics = e.Graphics;
int cx = 2; 
int cy = 2;
int Width = 60;
int Height = 60;
for (int Index = 0; Index < FileNames.Length; Index ++)
{
Image image = Image.FromFile(FileNames[Index]);
graphics.DrawImage(image, cx + (Index % 3) * (Width + cx), 
cy + (Index / 3) * (Height + cy), Width, Height);
}
}

#4


看是不是你循环语句有问题。还有图片文件如果大了的话是很占内存的。

#5


你看一下机器的配置吧。.net吃内存比较厉害。

#6


循环语句就在上面,图片每个只有几 K 而已,图片文件个数也只有 10 个左右

另:C#不会自己增加分配内存吗?我的机子内存还多的是呀!

#7


在panel7_Paint方法de的For循环中最后一行加上
image.Dispose();
原因是你必须释放资源。

#8


懒得写一个Form,自动发到feidao@vip.163.com,看看.

#9


我加了 image.Dispose();
也是一样的有错!

#10


已 发到 feidao@vip.163.com 了
麻烦看看

#11


up

#12


我原来也发现过这样的问题,经过试验,发现是相对路径的问题,我的数据都保存到当前目录的data文件夹下面,也就是说,我在程序又使用诸如"data\\a.txt"之类的文件,一般是正确的,但使用了打开/关闭文件等对话框后,当前路径就变了,如本来是myPro\data,就变成了你打开的文件所在的路径下,因此,我将程序改成Application.StatrPaht().Trim()+"\\data\\a.txt"之类就可以了,看看是不是这个原因.

#13


我使用的是绝对路径(全路径名)
与你所说的不同
而且它能显示一部分图片
当我选择 10 个左右图片文件时就出错

#14


up

#15


你在哪里加的Dispose?是循环里面吗?

#16


1。建议在一个大Panel内创建多个小Panel,在每个小Panel里各Load一张Image,尽量只重画发生变化的小Panel,而不是把所有的画都放在一个大Panel,一口气都画出来。

2。如果不显式释放内存,而仅仅靠C#的内存机制释放内存,并不能立竿见影,需要较长的一段时间。

#17


我运行程序,没有任何问题啊??

我打开了200个我私人珍藏的MM图片也没有问题啊..他们一个个都是100K左右的东东啊:))

内存CPU都是正常的!!

是不是你机器的原因??

我的环境:

WinXP Pro + SP1 + .net framework 1.1(1.0 sp2)
1.7G + 256M


#18


这样的配置可以了,dispose()没用,不知道是什么问题

#19


你的代码有问题!!!
你的代码没有释放通用对话框资源,在程序运行期间,这些对话框被CLR认为你一直在使用而实际没有用.你的代码也没有释放图象资源,只要没有释放的资源被征用时,就会警告内存不足,请参看下面的代码修改!

private void openFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
FileNames = openFileDialog1.FileNames;
panel7.Invalidate();
                           openFileDialog1.Dispose();// 请添加
}

private void panel7_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
if (FileNames == null) 
return;
if (FileNames.Length == 0)
return;
                            
Graphics graphics = e.Graphics;
int cx = 2; 
int cy = 2;
int Width = 60;
int Height = 60;
                            
                                                        

for (int Index = 0; Index < FileNames.Length; Index ++)
{
Image image= Image.FromFile(FileNames[Index]); graphics.DrawImage(image, cx + (Index % 3) * (Width + cx), 
cy + (Index / 3) * (Height + cy), Width, Height);
                            if(image!=null)
                            image.Dispose();//确保释放图象资源!!!!!!

}
}


#20


gz!
STUDY!

#21


真高兴 有学到了点东西!哈 谢谢 海天 哈

#22


收藏

#23


gz

#24


收藏

#25


up

#26


hehe
同样的错误

#27


是不是瑞星之类的追着跑,来这怪M$ ..

#28


我从来不用 瑞星 
呵呵

MS 也会有问题的
要不然 比尔.改死 也不至于叫 补丁大王 了

#29


TO: 飞刀
我换了台机子也不行
是不是 我的 .NET 版本有问题?

#30


这是一个简单的问题, 相对来说. 我碰到过一个真正的内存漏出的c#问题.
当时,是由于gdi + 对象的new 试用与CollectionBase的问题. 

.Net在Gdi+方面还是有一定的问题的. 我想.

#31


杀毒!
加内存!

#32


问题依旧:


************** 异常文本 **************
System.OutOfMemoryException: 内存不足。
   at System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement)
   at System.Drawing.Image.FromFile(String filename)
   at MMSComposer.Form1.panel7_Paint(Object sender, PaintEventArgs e) in d:\mms vasp\mmscomposer\form1.cs:line 957
   at System.Windows.Forms.Control.OnPaint(PaintEventArgs e)
   at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
   at System.Windows.Forms.Control.WmPaint(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

#33


up

#34


感觉用Dispose 方法没什么效果

#1


本人初用 C# 请高手指点一二
以提高本人对学 C# 的积极性
不胜感激!

#2


有多少人在线?怎不见有高手回答问题?

#3


相关代码如下:

private void button1_Click(object sender, System.EventArgs e)
{
openFileDialog1.ShowDialog();
}

private void openFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
FileNames = openFileDialog1.FileNames;
panel7.Invalidate();
}

private void panel7_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
if (FileNames == null) 
return;
if (FileNames.Length == 0)
return;

Graphics graphics = e.Graphics;
int cx = 2; 
int cy = 2;
int Width = 60;
int Height = 60;
for (int Index = 0; Index < FileNames.Length; Index ++)
{
Image image = Image.FromFile(FileNames[Index]);
graphics.DrawImage(image, cx + (Index % 3) * (Width + cx), 
cy + (Index / 3) * (Height + cy), Width, Height);
}
}

#4


看是不是你循环语句有问题。还有图片文件如果大了的话是很占内存的。

#5


你看一下机器的配置吧。.net吃内存比较厉害。

#6


循环语句就在上面,图片每个只有几 K 而已,图片文件个数也只有 10 个左右

另:C#不会自己增加分配内存吗?我的机子内存还多的是呀!

#7


在panel7_Paint方法de的For循环中最后一行加上
image.Dispose();
原因是你必须释放资源。

#8


懒得写一个Form,自动发到feidao@vip.163.com,看看.

#9


我加了 image.Dispose();
也是一样的有错!

#10


已 发到 feidao@vip.163.com 了
麻烦看看

#11


up

#12


我原来也发现过这样的问题,经过试验,发现是相对路径的问题,我的数据都保存到当前目录的data文件夹下面,也就是说,我在程序又使用诸如"data\\a.txt"之类的文件,一般是正确的,但使用了打开/关闭文件等对话框后,当前路径就变了,如本来是myPro\data,就变成了你打开的文件所在的路径下,因此,我将程序改成Application.StatrPaht().Trim()+"\\data\\a.txt"之类就可以了,看看是不是这个原因.

#13


我使用的是绝对路径(全路径名)
与你所说的不同
而且它能显示一部分图片
当我选择 10 个左右图片文件时就出错

#14


up

#15


你在哪里加的Dispose?是循环里面吗?

#16


1。建议在一个大Panel内创建多个小Panel,在每个小Panel里各Load一张Image,尽量只重画发生变化的小Panel,而不是把所有的画都放在一个大Panel,一口气都画出来。

2。如果不显式释放内存,而仅仅靠C#的内存机制释放内存,并不能立竿见影,需要较长的一段时间。

#17


我运行程序,没有任何问题啊??

我打开了200个我私人珍藏的MM图片也没有问题啊..他们一个个都是100K左右的东东啊:))

内存CPU都是正常的!!

是不是你机器的原因??

我的环境:

WinXP Pro + SP1 + .net framework 1.1(1.0 sp2)
1.7G + 256M


#18


这样的配置可以了,dispose()没用,不知道是什么问题

#19


你的代码有问题!!!
你的代码没有释放通用对话框资源,在程序运行期间,这些对话框被CLR认为你一直在使用而实际没有用.你的代码也没有释放图象资源,只要没有释放的资源被征用时,就会警告内存不足,请参看下面的代码修改!

private void openFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
FileNames = openFileDialog1.FileNames;
panel7.Invalidate();
                           openFileDialog1.Dispose();// 请添加
}

private void panel7_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
if (FileNames == null) 
return;
if (FileNames.Length == 0)
return;
                            
Graphics graphics = e.Graphics;
int cx = 2; 
int cy = 2;
int Width = 60;
int Height = 60;
                            
                                                        

for (int Index = 0; Index < FileNames.Length; Index ++)
{
Image image= Image.FromFile(FileNames[Index]); graphics.DrawImage(image, cx + (Index % 3) * (Width + cx), 
cy + (Index / 3) * (Height + cy), Width, Height);
                            if(image!=null)
                            image.Dispose();//确保释放图象资源!!!!!!

}
}


#20


gz!
STUDY!

#21


真高兴 有学到了点东西!哈 谢谢 海天 哈

#22


收藏

#23


gz

#24


收藏

#25


up

#26


hehe
同样的错误

#27


是不是瑞星之类的追着跑,来这怪M$ ..

#28


我从来不用 瑞星 
呵呵

MS 也会有问题的
要不然 比尔.改死 也不至于叫 补丁大王 了

#29


TO: 飞刀
我换了台机子也不行
是不是 我的 .NET 版本有问题?

#30


这是一个简单的问题, 相对来说. 我碰到过一个真正的内存漏出的c#问题.
当时,是由于gdi + 对象的new 试用与CollectionBase的问题. 

.Net在Gdi+方面还是有一定的问题的. 我想.

#31


杀毒!
加内存!

#32


问题依旧:


************** 异常文本 **************
System.OutOfMemoryException: 内存不足。
   at System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement)
   at System.Drawing.Image.FromFile(String filename)
   at MMSComposer.Form1.panel7_Paint(Object sender, PaintEventArgs e) in d:\mms vasp\mmscomposer\form1.cs:line 957
   at System.Windows.Forms.Control.OnPaint(PaintEventArgs e)
   at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
   at System.Windows.Forms.Control.WmPaint(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

#33


up

#34


感觉用Dispose 方法没什么效果