本帖最后由 jshzp 于 2011-04-28 12:17:42 编辑

解决方案 »

  1.   

    直接re掉,做了3年,还没发现这个bufferimage.Dispose();方法有什么实际效用
      

  2.   


    re掉不就不会有warning咯
    //          bufferimage.Dispose();
    //                sBP.Dispose();
    微软那个warning是说,如果写这两行代码在这里,有可能会提前释放掉,frmM.BackgroundImage就会变成空,没有图片了
      

  3.   

    1、frmM.BackgroundImage = bufferimage;
    2、bufferimage.Dispose();
    3、sBP.Dispose();frmM.backgroundImage 和 bufferimage 引用的是同一个东西
    bufferimage.Dispose()了,frmM.backgroundImage 也释放资源了  可能出现意外结果这种情况下  我觉得就想楼上所说的  不用Dispose了吧  不过我碰到一种情况  必须Dispose掉当你想通过Image.FromFile()来给PictureBox.Image赋值时  不能直接用完就了事
    像这样
    Image image=Image.FromFile(path);
    Picture1.Image=image;
    这样之后,程序中如果要用到 path 指定的那个图片文件时  总是提示文件正在使用  所以这种情况应该将Image  Dispose掉
    像这样:
                    Image image = Image.FromFile(path);
                    Image bmp = new Bitmap(image);
                    image.Dispose();
                    pictureBox1.Image = bmp;楼主那种情况 也涉及到文件  你可以试一下  不Dispose的话  能否同时在其他地方使用(移动或者删除什么的)dir.ToString() + @"\" + ImgInfo[imgIndex].Name这个文件
      

  4.   

    感谢xiaozhi_5638的讨论。
    刚才一高手指点我应该使用using语句隐式地释放该对象,我把代码改成下面的方式:
    [code=C#]try
                {
                    int imgIndex = ra.Next(ImgInfo.Length);
                    using (Bitmap bufferimage = new Bitmap(frmM.Width, frmM.Height))
                    {
                        Bitmap sBP = new Bitmap(dir.ToString() + @"\" + ImgInfo[imgIndex].Name);
                        using (Graphics g = Graphics.FromImage(bufferimage))
                        {
                            g.DrawImage(sBP, new Rectangle(0, 0, frmM.Width, frmM.Height), new Rectangle(0, 0, sBP.Width, sBP.Height), GraphicsUnit.Pixel);
                        }
                        frmM.BackgroundImage = bufferimage;
                        sBP.Dispose();
                    }
                }
                catch { }code]
    再次运行代码分析后,果然排除了CA2000的警告。先前显式调用Dispose()方法不行,现在使用using语句隐式地调用(根据MSDN的解释,GC会在using语句结束时,回收在using中创建的对象)就行了。
    谁能告诉我其中的道理啊?
      

  5.   

    因为using块是语句块,块内变量生存期只在块内...显然你这些块内并不存在块外引用,所以不需要警告...跟你顶楼的描述并不是一回事...
      

  6.   

    frmM.BackgroundImage = bufferimage;
    -----------------------
    没注意看...有一个块外引用,但是资源已经释放...能不能显示呢?没注意过...
      

  7.   

    try
                {
                    int imgIndex = ra.Next(ImgInfo.Length);
                    using (Bitmap bufferimage = new Bitmap(frmM.Width, frmM.Height), sBP = new Bitmap(dir.ToString() + @"\" + ImgInfo[imgIndex].Name))
                    {
                        using (Graphics g = Graphics.FromImage(bufferimage))
                        {
                            g.DrawImage(sBP, new Rectangle(0, 0, frmM.Width, frmM.Height), new Rectangle(0, 0, sBP.Width, sBP.Height), GraphicsUnit.Pixel);
                        }
                        frmM.BackgroundImage = bufferimage;
                    }
                }
                catch { }
    刚才C#代码显示不正常,现在重新贴一下,这样可能就容易看了
    PS:反映下,论坛中回复的帖子不能编辑,太不方便了!这么做是不是因小失大了呢?
      

  8.   

    其实只是csdn的人懒得加个编辑功能而已
      

  9.   

    嗯,这回可以正常显示了。可以看出,frmM.BackgroundImage = bufferimage;是在第一个using语句内部。我贴的是真实代码,实际上还有sBP、g对像,帖子中只是集中注意力讨论bufferimage对象,所以和第二个Using语句无关。
      

  10.   

    刚才睁大眼睛,仔细看了一下VS给出的CA2000警告,注意到其中一句话“请对该对象调用system.IDisposable.Dispose”,联想到system.IDisposable.Dispose方法好像是由垃圾回收器在对象作用期结束时自动调用的!也就是说VS认为这里只能由垃圾回收器自动回收对象,而不应该显式地调用Dispose()方法回收。
    如果我的这个理解是正确的,那么就能解释前面的问题了。
    希望高手予以签定!