关于图像内存释放和删除图像文件的问题!(急!)

Frog1228 2011-11-08 09:37:45
在程序中有一个树视图,树视图里的节点是各图像文件的节点,当用户单击各个节点的时候,就有一个窗口来显示该节点对应的图像,窗口只用了一个,所以说应该是用户单击各个节点的时候,该窗口来切换显示各个图像,每个节点的图像路径我是知道的,所以在切换图像的时候,窗口所做的操作是:先释放窗口图片框原来加载的图像,然后通过Image.FromFile(@文件名)来显示当前点击的图像,但是我发现在我连续不断地点击节点切换图像的时候,程序的内存会不断地往上升,所以我在释放图片框原来加载的图像的时候,再加了一句 GC.Collect(),调用垃圾回收器强制释放图像所占内存,因为点击的速度太快,垃圾回收器并没有即时地释放原来图片所占的内存。现在的问题是,当我右击删除某图像节点时,需要删除该图像文件,因为窗口正好显示当前要删除的图像节点的图像,虽然我在删除图像文件之前,先将窗口关闭,在窗口的Dispose方法中,将图像释放掉,并调用了 GC.Collect(),但是还会报出错误:“另一进程正在使用该文件,因此无法访问该文件”。这种出错的情况尤其发生在连续不断点击节点切换图像的时候,如果不点击节点切换,删除图像文件不会报这种错误。我想问一下,有什么方法可以解决这个问题?我想不到解决的方法。不甚感激,谢谢!!!
...全文
414 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdl2005lyx 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mjjackey 的回复:]
嗯,改变一下读取的方式就可以了,原来我是,pictureBox.Image=Image.FromFile(@文件),现在Image img==Image.FromFile(@文件); pictureBox.I……
[/Quote]

对,就这样使用:
Image.Dispose 方法:
1、释放由 Image 使用的所有资源。调用 Dispose 方法可以为其他目的而重新分配此 Image 所使用的资源。
2、使用完 Image 后调用 Dispose。Dispose 方法使 Image 处于不可用状态。调用完 Dispose 后,必须释放对 Image 的所有引用,这样垃圾回收器才能收回 Image 占用的内存。
3、每次释放对 Image 的最后一个引用前,均应调用 Dispose。否则,在垃圾回收器调用 Image 对象的 Finalize 方法之前,正在使用的资源不会被释放。


阿非 2011-11-08
  • 打赏
  • 举报
回复
嗯,构造一个副本用于操作。
蝶恋花雨 2011-11-08
  • 打赏
  • 举报
回复
用完就得关掉。要不然立刻让你变X号。还有进程中使用。操作image就是这么麻烦。
Frog1228 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yuwenge 的回复:]
Image.FromStream来获取图片,得到图片之后dispose掉stream。这样不用图片的时候dispose掉image就可以了。
[/Quote]
嗯,改变一下读取的方式就可以了,原来我是,pictureBox.Image=Image.FromFile(@文件),现在Image img==Image.FromFile(@文件); pictureBox.Image=new Bitmap(img); img.dispose();就可以了。
卧_槽 2011-11-08
  • 打赏
  • 举报
回复
Image.FromStream来获取图片,得到图片之后dispose掉stream。这样不用图片的时候dispose掉image就可以了。
黄亮 2011-11-08
  • 打赏
  • 举报
回复
图像加载进来后删除已经和gc没有关系了,查看你读取图像的代码,看是不是流没关闭。
liukaizxc 2011-11-08
  • 打赏
  • 举报
回复
用的着加载 删除么? 你在点击树的 SelectChangeNodeEvent 里面写 把右边的图片路径重新指定一下不就行了 何必这么麻烦

111,095

社区成员

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

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

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