Heute bin ich auf ein Dilemma gestoßen. Ich habe eine App erstellt, die GDI + verwendet, um auf ein Formular zu zeichnen. Die Zeichnung wird jede Sekunde von einem Timer ausgelöst. Die draw-Methode verwendet eine for-Schleife, um eine Sammlung von Objekten zu durchlaufen, und wenn sie einen bestimmten Status haben, zeichnen Sie sie.C# GDI +, Erstellen eines LinearGradientBrush in einer Schleife (Speicherlecks)
Ich möchte sie mit einem LinearGradientBrush zeichnen, einfach weil es so viel schöner aussieht als ein einfacher Pinsel. Werfen Sie einen Blick auf die folgende
//minutes
foreach (Led l in MinuteGrid.Leds)
{
LinearGradientBrush b = new LinearGradientBrush
(l.LedRectangle, Color.GreenYellow, Color.Green, 110);
if (l.IsLit)
g.FillRectangle(b, l.LedRectangle);
b.Dispose();
}
Ich bin ein neuer LinearGradientBrush für jede Iteration der Schleife zu schaffen (was mich stört), aber das ist, weil ich zu haben. Ich kann keinen außerhalb der Schleife erstellen, da sein Konstruktorsatz verlangt, dass ich Parameter setze, die nur innerhalb der Schleife bekannt sind.
Ich finde, dass die Verwendung der dispose-Methode für das LinearGradientBrush-Objekt nicht so zuverlässig ist. Wenn ich meine App starte und sie im Task-Manager anschaue, spuckt sie ihren Speicher aus. Als ich dann fügen Sie die b = null Linie, die enorm zu helfen scheint, als
foreach (Led l in MinuteGrid.Leds)
{
LinearGradientBrush b = new LinearGradientBrush
(l.LedRectangle, Color.GreenYellow, Color.Green, 110);
if (l.IsLit)
g.FillRectangle(b, l.LedRectangle);
if (b != null)
{
b.Dispose();
b = null;
}
}
folgt bin ich frage mich nur, wenn es eine bessere Art und Weise mit LinearGradientBrushes zu arbeiten? Oder gibt es eine bessere Lösung?
Vielen Dank
Ohrfeigen, doh! natürlich sind Sie so richtig, ich bin ein bisschen peinlich davon :) –