处理静电刷

时间:2009-01-23 02:22:54

标签: c# asp.net dispose system.drawing brush

我正在写一个生物节律应用程序。 为了测试它,我有一个带有Button和PictureBox的表单。 当我点击按钮时,我

myPictureBox.Image = GetBiorhythm2();

第一次运行正常,但第二次点击会导致以下异常:

System.ArgumentException: Parameter is not valid.
   at System.Drawing.Graphics.CheckErrorStatus
   at System.Drawing.Graphics.FillEllipse
   at Larifari.Biorhythm.Biorhythm.GetBiorhythm2 in c:\delo\Horoskop\Biorhythm.cs:line 157
   at Larifari.test.Button1Click in c:\delo\Horoskop\test.Designer.cs:line 169
   at System.Windows.Forms.Control.OnClick
   at System.Windows.Forms.Button.OnClick
   at System.Windows.Forms.Button.OnMouseUp
   at System.Windows.Forms.Control.WmMouseUp
   at System.Windows.Forms.Control.WndProc
   at System.Windows.Forms.ButtonBase.WndProc
   at System.Windows.Forms.Button.WndProc
   at ControlNativeWindow.OnMessage
   at ControlNativeWindow.WndProc
   at System.Windows.Forms.NativeWindow.DebuggableCallback
   at ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop
   at ThreadContext.RunMessageLoopInner
   at ThreadContext.RunMessageLoop
   at System.Windows.Forms.Application.Run
   at Larifari.test.Main in c:\delo\Horoskop\test.cs:line 20

导致错误的缩减功能是:

public static Image GetBiorhythm2() {
        Bitmap bmp = new Bitmap(600, 300);
        Image img = bmp;
        Graphics g = Graphics.FromImage(img);

        Brush brush = Brushes.Black;
        g.FillEllipse(brush, 3, 3, 2, 2); //Here the exception is thrown on the second call to the function

        brush.Dispose(); //If i comment this out, it works ok.

        return img;
 }

如果我评论出刷子处理它可以正常工作,但我对此并不满意,并希望找到另一种解决方案。你能帮帮我吗?

3 个答案:

答案 0 :(得分:14)

Bruhes.Black是一种系统资源,不适合您处置。运行时管理Brushes类,Pens和其他此类对象中的画笔。它根据需要创建和处理这些对象,使常用项目保持活动状态,以便不必不断创建和销毁它们。

Brushes类的文档说:

  

Brushes类包含静态   返回a的只读属性   刷子对象的颜色表示   属性名称。你通常这样做   不必明确处置   刷子在这个属性中返回   除非用于构造,否则为class   一把新刷子。

简而言之,不要在系统提供的对象上调用Dispose。

答案 1 :(得分:11)

看起来你正试图处理静态,这会在下次使用时导致一些问题:

    Brush brush = Brushes.Black;
    g.FillEllipse(brush, 3, 3, 2, 2); //Here the exception is thrown on the second call to the function

    brush.Dispose(); //If i comment this out, it works ok.

当你设置brush = Brushes.Black时,你实际上是将画笔设置为静态Brushes.Black的引用(或指针)。通过处理它,你就可以有效地写作:

    Brushes.Black.dispose();

当你回来再次使用黑色画笔时,运行时说你不能,因为它已经被处理掉了,并且不是g.FillEllipse()的有效参数

更好的方式来写这个可能只是简单:

    g.FillEllipse(Brushes.Black, 3, 3, 2, 2);

或者,如果你想真的很复杂:

    Brush brush = Brushes.Black.Clone();
    g.FillEllipse( brush, 3, 3, 2, 2 );
    brush.Dispose();

或者如果你不关心看错的事情,只需注释掉brush.Dispose();原始代码中的行。

答案 2 :(得分:3)

我认为你不需要打电话。只有在创建新画笔时,才会在静态画笔上使用。虽然,就个人而言,我会使用using语法.. ie:

using (Brush brush = new SolidBrush(...))
{
    g.FillEllipse(brush, 3, 3, 2, 2);
}

你应该对你创建的图形对象做同样的事情。