none
如何释放Graphics RRS feed

  • 问题

  •      我写了段画图代码在一个自定义方法show_time()中,通过Timer控件来按照指定的时间间隔调用。
    调试成功后,发现每次Timer_Tick()调用画图的自定义方法show_time()后,会增加占用内存4k。
    于是,在自定义方法show_time()中,画图结束后添加或注释Graphics.Dispose(),都不能解决内
    存增加的问题。望大家指点指点。

    show_time()方法代码
    private void show_time()
    {
          ..........  //略掉坐标定义及画笔定义代码

          Graphics gp = CreateGraphics();
          gp.Clear(this.BackColor);
          gp.DrawEllipse(mypen, x, y, intR, intR);
          gp.DrawEllipse(mypenH, x0 , y0 , 5, 5);
          gp.DrawLine(mypenH, x0, y0, x1, y1);
          gp.DrawLine(mypenM, x0, y0, x2, y2);
          gp.DrawLine(mypenS, x0, y0, x3, y3);
          gp.Dispose();
    }

    2010年4月23日 0:44

答案

  • CreateGraphics似乎是一个自定义函数,能否分享一下它的代码?

    另外,.Net中的垃圾回收并不是实时的,有可能内存增长到一程度之后才会下降,你可以观察比较长的时候,比如1天,看看内存的走势。


    Shuhai Shen - http://leonax.net
    • 已标记为答案 ybgjj2009 2010年4月23日 6:35
    2010年4月23日 0:56

全部回复

  • 4K = =~

    2010年4月23日 0:53
  • CreateGraphics似乎是一个自定义函数,能否分享一下它的代码?

    另外,.Net中的垃圾回收并不是实时的,有可能内存增长到一程度之后才会下降,你可以观察比较长的时候,比如1天,看看内存的走势。


    Shuhai Shen - http://leonax.net
    • 已标记为答案 ybgjj2009 2010年4月23日 6:35
    2010年4月23日 0:56
  • CreateGraphics似乎是一个自定义函数,能否分享一下它的代码?

    另外,.Net中的垃圾回收并不是实时的,有可能内存增长到一程度之后才会下降,你可以观察比较长的时候,比如1天,看看内存的走势。


    Shuhai Shen - http://leonax.net

    是 this.CreateGraphics()
    2010年4月23日 2:06
  • 1. gp.Dispose();并且确定没有别的地方在引用gp

    2. 调用GC.Collect();

    GC.Collect()本身就比较影响效率,所以最好不每次在Timer_Tick事件中都调用,可以加在timer事件结束的时候

    2010年4月23日 4:28
  • CreateGraphics似乎是一个自定义函数,能否分享一下它的代码?

    另外,.Net中的垃圾回收并不是实时的,有可能内存增长到一程度之后才会下降,你可以观察比较长的时候,比如1天,看看内存的走势。


    Shuhai Shen - http://leonax.net

    我将timer的触发时间改为1毫秒,发现内存增加到一定程度就被释放了一部分,看来确实是垃圾回收的设置:自动选择适当的时机。
    2010年4月23日 6:35