none
释放图片所占的内存 RRS feed

  • 问题

  • Bitmap bmp = new Bitmap("xxxxx.jpg");

    pictureBox.Image = bmp;

    这时候,去磁盘上修改图片的名字会提示图片被占用。

    pictureBox.Image.Dispose();

    pictureBox.Image = null;

    这样做了之后还是无法修改图片的名字,文档上说调用Dispose()之后,将图片引用为null,这样可是使GC正确回收内存资源,那就是说根本没法确定他什么时候回收了?有什么办法可以立即释放这个占用吗?

     

    谢谢!

    2011年11月24日 3:39

答案

  • 您好

    請參考

    影像檔案已被鎖定,當您將 PictureBox Image 屬性設定為檔案

    http://support.microsoft.com/kb/309482/zh-tw 

                // using System.IO;
                FileStream fs = new FileStream("D:\\1.jpg", FileMode.Open, FileAccess.Read);
                pictureBox1.Image = System.Drawing.Image.FromStream(fs);
                fs.Close();
    

     


    歡迎參觀我的Blog.NET菜鳥自救會
    2011年11月24日 3:52
  • Bitmap bmp = new Bitmap("xxxxx.jpg");

    pictureBox.Image = bmp;

    这时候,去磁盘上修改图片的名字会提示图片被占用。

    pictureBox.Image.Dispose();

    pictureBox.Image = null;

    这样做了之后还是无法修改图片的名字,文档上说调用Dispose()之后,将图片引用为null,这样可是使GC正确回收内存资源,那就是说根本没法确定他什么时候回收了?有什么办法可以立即释放这个占用吗?

     

    谢谢!

    在你回收内存的地方

    试试 GC.Collect();

     

    2011年11月24日 8:49
  • PictureBox.Image 是一个非托管/托管混合资源,Dispose() 只负责回收托管资源 (Dispose(false) 负责非托管资源,如果有正确实现 IDisposable 模式),每个 Image 会占用一个 Win32 HBITMAP 的句柄。必须关闭这个句柄 (用 CloseHandle) 才可以算是完全释放了 Image。


    Mark Zhou
    2011年11月24日 9:00
  • 你释放错了。应该用bmp.dispose();
    2011年11月28日 6:28

全部回复