Anordnen eine statische Bürste
-
19-08-2019 - |
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?
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.