新手求助 c# winform程序怎么收回内存

lunber 2012-08-17 02:27:59

if (dt.Rows.Count > 0)
{
Byte[] zl = (Byte[])dt.Rows[0][0];
MemoryStream ms = new MemoryStream();
ms.Write(zl, 0, zl.Length);
Image ima1 = Image.FromStream(ms, true);
Bitmap bm = new Bitmap(ima1);
ima1.Dispose();
ms.Close();
ms.Dispose();
pictureBox1.Image = Image.FromHbitmap(bm.GetHbitmap());
//pictureBox1.Image = Image.FromStream(ms, true);
bm.Dispose();
}
dt.Dispose();
GC.Collect();

这段代码是从Access数据库中读取一个图片显示在PictrueBox控件中,
运行前可用内存是:1179700
运行时可用内存是: 756000
运行后可用内存是: 895000
这是读取3M的图片时情况,有大概300M的可用内存没有收回,读取10M的图片时直接内存不足,报错了
请问高手们怎么最大限度的收回可用内存啊
...全文
245 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
qldsrx 2012-08-21
  • 打赏
  • 举报
回复
网上给出那方法的人自己肯定也没搞清楚,ms锁定是不可能的,因为MemoryStream是托管资源,只要没有引用,自动会回收,只有非托管资源才需要手动调用Dispose,而这里的非托管资源就是Image,所以释放Image才是最关键的,另外Image释放的同时,对应的原始流也会自动释放的。
lunber 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

你的那段代码,真的让我没话说了,给我的感觉是“拆东墙补西墙”。
C# code
if (dt.Rows.Count > 0)
{
Byte[] zl = (Byte[])dt.Rows[0][0];
MemoryStream ms = new MemoryStream(zl);
……
[/Quote]
多谢高手,内存占用少多了。
多创建一个Image是在网上找的方法,说是原来的Image不释放,ms就锁定了,不回释放内存
qldsrx 2012-08-21
  • 打赏
  • 举报
回复
你的那段代码,真的让我没话说了,给我的感觉是“拆东墙补西墙”。
            if (dt.Rows.Count > 0)
{
Byte[] zl = (Byte[])dt.Rows[0][0];
MemoryStream ms = new MemoryStream(zl);
Image ima1 = Image.FromStream(ms, true);
if(pictureBox1.Image != null)
{
pictureBox1.Image.Dispose();
pictureBox1.Image = null;//这行也可以不要,后面反正会更换掉
}
pictureBox1.Image = ima1;
}
dt.Dispose();
GC.Collect();

看我优化后的代码,自己体会下你自己问题在哪里吧,应该不难看出。你为了是否一个Image对象,就再创建另一个Image对象,反而使得内存使用量增加,没有火上浇油。
Castiel丶Luo 2012-08-21
  • 打赏
  • 举报
回复

using(MemoryStream ms = new MemoryStream())
+++
using 各种临时变量

lunber 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

C#..是自动回收的,它不是C也不是C++,你只要CLOSE和Dispose了就已经给变量标志了清除标志,就等着回收了。。如果想准确和更好的控制回收内存请用C。。。
[/Quote]
那我上边的代码要怎么优化呀,或者有其他方法吗?读3M的图片用了那么多内存,10M的就内存不足了,客户要读10M的图片
mizuho_2006 2012-08-21
  • 打赏
  • 举报
回复
隔一段时间系统会自动寻找空引用的变量,并将其内存空间释放。如果你要强制回收资源,请使用GC.Collect(),但一般不推荐使用,只有在建立大对象后并急需释放资源的时候才这么使用。
homejiji 2012-08-21
  • 打赏
  • 举报
回复
C#..是自动回收的,它不是C也不是C++,你只要CLOSE和Dispose了就已经给变量标志了清除标志,就等着回收了。。如果想准确和更好的控制回收内存请用C。。。
lunber 2012-08-21
  • 打赏
  • 举报
回复
没人吗,再顶
lunber 2012-08-17
  • 打赏
  • 举报
回复
自己顶,大神们赐教啊
lunber 2012-08-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

C# code

using(MemoryStream ms = new MemoryStream())
{

}
[/Quote]

我试了一下,和原来差不多呀,没有改善啊
shizhu820228 2012-08-17
  • 打赏
  • 举报
回复

using(MemoryStream ms = new MemoryStream())
{

}
shizhu820228 2012-08-17
  • 打赏
  • 举报
回复
using

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧