Wie kann ich das Flackern des Panels beim Neuzeichnen beheben?

Ich habe ein Panel, zu dem ich eine Unterklasse habe und das ich eingestellt habeDoubleBuffered Zwar muss ich die Zeichnung ständig aktualisieren, aber sie flackert und ich habe keine Ahnung warum.

private delegate void MyDelegate();

public void heartBeat()
    {
        while (true)
        {
            if (map.processNubots(rules))
            {
                if (this.InvokeRequired)
                {
                    this.Invoke((MyDelegate)delegate
                    {
                        //drawPanel.SuspendLayout();
                        drawPanel.Refresh();
                        displayGrid();
                        //drawPanel.ResumeLayout();
                    });
                }
                Thread.Sleep(500);
            }
            else
            {
                break;
            }
        }
    }

    public void displayGrid()
    {
        int i = 0;
        foreach (DictionaryEntry pair in map)
        {
            Monomer current = (Monomer)pair.Value;
            drawMonomers(current.getLocation(), current.getState());
            i++;
        }
    }

    public void drawMonomers(Point location, string state)
    {
        ...

        SolidBrush sb = new SolidBrush(mycolor);
        SolidBrush sbt = new SolidBrush(Color.Black);
        Graphics g = drawPanel.CreateGraphics();
        Font text = new Font("Arial", scale / 2);
        Pen pen = new Pen(Color.Black, 1);
        pen.Alignment = PenAlignment.Inset;
        g.FillEllipse(sb, offSet + ((location.Y * scale) / 2) + (location.X * scale), offSet + (-location.Y * scale), scale, scale);
        g.DrawEllipse(pen, offSet + ((location.Y * scale) / 2) + (location.X * scale), offSet + (-location.Y * scale), scale, scale);
        g.DrawString(state, text, sbt, (offSet + ((location.Y * scale) / 2) + (location.X * scale)) + scale / 6, (offSet + (-location.Y * scale)) + scale / 6);

        sb.Dispose();
        sbt.Dispose();
        pen.Dispose();
    }

Nach jeder "Berechnung" und nachdem ich etwas zu meinem imaginären Gitter hinzugefügt habe, muss ich das Feld aktualisieren, um dieses neue Element in meinem Gitter anzuzeigen. Ich habe versucht, das Panel kurz vor dem ungültig zu machendisplayGrid() Funktion, aber es scheint noch mehr Flackern zu verursachen.

Dasheartbeat() Die Funktion wird derzeit in einem separaten Thread aufgerufen.

Hier ist meine neuePanel Klasse.

public class Display : Panel
{
    public Display()
    {
        this.DoubleBuffered = true;

    }
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage