Frage

Ich schreibe eine Biorhythmus App. Um es zu testen, ich habe ein Formular mit einem Knopf und einem PictureBox. Wenn ich auf die Schaltfläche klicken i do

myPictureBox.Image = GetBiorhythm2();

Welche zum ersten Mal ok läuft, aber auf dem zweiten Klick es verursacht die folgende Ausnahme:

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

der Schnitt-down-Funktion, die den Fehler verursacht, ist:

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;
 }

wenn ich ein Kommentar-out die Bürste Entsorgung es ok funktioniert, aber ich bin nicht glücklich damit und will eine alternative Lösung zu finden. Können Sie mir bitte helfen?

War es hilfreich?

Lösung

Es sieht aus wie Sie versuchen, von einem statischen zu verfügen, das einige Probleme beim nächsten Mal führt es verwendet:

    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.

Wenn Sie Bürstensatz = Brushes.Black, Sie Einstellung tatsächlich Pinsel als Referenz (oder Zeiger) auf den statischen Brushes.Black. Durch die Anordnung es, gerade schreiben Sie effektiv:

    Brushes.Black.dispose();

Wenn Sie zurück kommen um wieder die schwarzen Pinsel zu verwenden, sagt die Laufzeit nicht kann, weil es bereits angeordnet worden und ist kein gültiges Argument g.FillEllipse ()

Eine bessere Möglichkeit, dies zu schreiben könnte nur einfach:

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

Oder, wenn Sie wirklich komplex darüber sein wollen:

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

Oder wenn Sie kümmern sich nicht um die Dinge schief suchen, nur die brush.Dispose Kommentar aus (); Zeile in der ursprünglichen Code.

Andere Tipps

Bruhes.Black ist eine Systemressource, und ist nicht für Sie zu entsorgen. Die Laufzeit verwaltet die Bürsten in der Pinsel-Klasse, die Stifte und andere solche Objekte. Es erstellt und verfügt diese Objekte je nach Bedarf, hält häufig verwendete Elemente am Leben, so dass sie nicht ständig muss sie schaffen und zu zerstören.

Die Dokumentation für die Bürsten Klasse sagt:

  

Die Bürsten-Klasse enthält statische   Nur-Lese-Eigenschaften, die eine Rückkehr   Bürsten Aufgabe der Farbe angezeigt durch   der Name der Eigenschaft. Sie in der Regel tun   müssen ausdrücklich nicht von der entsorgen   durch eine Eigenschaft in diesen zurück BRUSH   Klasse, es sei denn, es verwendet wird, zu konstruieren   eine neue Bürste.

Kurz gesagt, nicht nennen Entsorgen auf die vom System bereitgestellte Objekte.

Ich glaube nicht, Sie brauchen .Dispose auf statische Bürsten nennen, nur, wenn Sie neue schaffen. Obwohl ich persönlich würde die Verwendung von Syntax verwenden .. also:

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

Und Sie sollten wahrscheinlich das gleiche tun mit der Grafik-Objekt Sie erstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top