相关代码如下
           tembmp = new Bitmap(templatebmp);
            g = Graphics.FromImage(tembmp);
             ((PictureBox)this.Controls["pictureBox"]).Image = Image.FromHbitmap(tembmp.GetHbitmap());
            g.Dispose();
            tembmp.Dispose();就是这些,每执行一次,就会吃掉一张图片的内存,我曾试了每次dispose PictureBox后再生成PictureBox,但是没有效果
求高手解惑。

解决方案 »

  1.   

    Using tembmp as new bitmap(....)
     Using G as graphics=graphics.....
    .....
     End Using
    End Using
      

  2.   

    ((PictureBox)this.Controls["pictureBox"]).Image.Dispose()
      

  3.   

    谢谢两位,没想半夜还有人在线回复
    用dylike的写法没有效果
    参考xiehuanxie老师的提醒加入如下代码
                if (((PictureBox)this.Controls["pictureBox" ]).Image != null)
                {
                    ((PictureBox)this.Controls["pictureBox"]).Image.Dispose();
                }
    吃内存的速度降低了一半,效果明显,但另一半丢在哪里了呢??望高手再帮忙分析一下
      

  4.   

    在现在的pc上,我经常看到有人说:“这个程序好,因为它只占100K内存,而不是10M”。我的老天!在现在的pc上,申请100K跟申请10M内存有什么好PK的?纯粹是读20年前的书走火入魔了。
      

  5.   

    因为我要同时更新12张加起来相当于一个屏幕大小的图片,之前的代码执行一次,内存便占用便多12M,
    我加上
    if (((PictureBox)this.Controls["pictureBox" ]).Image != null)
      {
      ((PictureBox)this.Controls["pictureBox"]).Image.Dispose();
      }这几句后,执行一次,内存占用变成每次6M左右
    不相信的同学可以自己试一下,
    如果每次6M,那我执行100次以上后程序不就变成个宠然大物了??
    请达人指点
      

  6.   

    图片格式为BMP格式,因为JPG格式看来效果很不好,灰蒙蒙的,所以没用
      

  7.   

    你在代码里都加上“GC.Collect();”试试。如果回收了GC还是内存还被吃掉,那可能是有内存泄漏了。
      

  8.   

    有点意思,这个问题,虽然我不知道怎么回答你,但是你和有遇到的一个问题有点相似,  我的是动态的在panel里面添加lable大概160个吧,然后我要做一个刷新,就要先清空 重新绑定,这个没问题,我不知道你是不是放在一个容器里面,如果是的话你可以<假如是panel。 this.panel.controls.clear(); 清空当前控件内的所有集合>,然后再重新调用一次你的图片加载的方法即可。
      

  9.   

     ((PictureBox)this.Controls["pictureBox"]).Image = Image.FromHbitmap(tembmp.GetHbitmap());=========》》》 ((PictureBox)this.Controls["pictureBox"]).Image = tembmp;
      

  10.   

    我诚心求教!
    测试代码如下,感兴趣的同学调试一下
    类内声明:
            Bitmap tembmp = null;
            Graphics g = null;
            Bitmap templatebmp = null;
            PictureBox tempic = null;
    在Form Load事件中
                templatebmp = new Bitmap(1200,900);
                Graphics gr = Graphics.FromImage(templatebmp);
     在这里,我预画了很多东西
                    tempic = new PictureBox();
                    tempic.Name = "pictureBox";
                    tempic.Location = new System.Drawing.Point(10, 10);
                    tempic.Size = templatebmp .Size;
                    tempic.TabStop = false;
                    this.Controls.Add(tempic);在执行函数里
                    using(tembmp = new Bitmap(templatebmp))
                    {
                        using (g = Graphics.FromImage(tembmp))
                        {
                        g.DrawString(string.Format("对号码'{0}'的频率分析",i), tft, Brushes.White, 0, 0);
                        g.DrawLines(cpen1, p16);
                        g.DrawLines(cpen2, p48);
                        g.DrawLines(cpen3, p90);
                        g.DrawLines(cpen4, p360);                    if (((PictureBox)this.Controls["pictureBox" ]).Image != null)
                            {
                                ((PictureBox)this.Controls["pictureBox" ]).Image.Dispose();
                            }
                        ((PictureBox)this.Controls["pictureBox" + i]).Image = Image.FromHbitmap(tembmp.GetHbitmap());                    }
                    }
      

  11.   


    GC.Collect();应该会立竿见影的。
      

  12.   


    这个我昨天就试过,按理说好像是可以,但改后运行时就会出现参数错误中断,最后卡在
                Application.Run(new form());这里
      

  13.   


    这个也试了
      if (((PictureBox)this.Controls["pictureBox" ]).Image != null)
      {
      ((PictureBox)this.Controls["pictureBox" ]).Image.Dispose();
      }
     GC.Collect();
      ((PictureBox)this.Controls["pictureBox" ]).Image = Image.FromHbitmap(tembmp.GetHbitmap());
    内存占用还是以5M-6M的速度增加,
    上面我的 
    ((PictureBox)this.Controls["pictureBox" +i]).Image = Image.FromHbitmap(tembmp.GetHbitmap());
    多个 +i,原程序是要刷新一组图片的,测试时去掉
      

  14.   

    我做的是定时重画一组趋势图
    因为是PictureBox,要更新的是图片,PictureBox如果被清掉重画,那么界面会有一个很大的闪烁,如果固定PictureBox,只更新图片,才能出来像股票行情界面那样好像线条在走的效果。
      

  15.   

    http://topic.csdn.net/u/20100322/11/1F844972-CB83-4B9A-802E-507619872AF3.html备注
    --------------------------------------------------------------------------------FromHbitmap 方法生成 GDI 位图的一个副本,因此创建新的 Image 后立即使用 GDIDeleteObject 方法,您可以释放传入的 GDI 位图。
      

  16.   

    终于遇到真正的达人了,谢谢
    相关代码改为如下:
    IntPtr temipr = tembmp.GetHbitmap();
    ((PictureBox)panel1.Controls["pictureBox" + i]).Image = Image.FromHbitmap(temipr);
    DeleteObject(temipr);问题消除!!
    大大长了见识呀。
    向您致敬!
      

  17.   

    以前LANDesk来我们公司吹他们的桌面管理系统,说他们蓝代斯克与英特尔有非常密切的合作关系,做出来的东西多么强大。
    一不小心买了几百个点的,实验没有什么问题,谁知投用后才发现是个不成熟的产品,
    我们的机器是要24*7*365一直运行的,可是只用了三天就发现CPU占用率竟达到了70%,大概以前他们是给监控员工电脑安装的吧,没想在在线运行的系统里不断蚕食CPU资源,最后不可收拾。