¿Cómo arreglar el parpadeo del panel al volver a dibujar?

Tengo un panel que he subclasificado y he establecidoDoubleBuffered es cierto, necesito actualizar constantemente el dibujo, pero parpadea y no tengo idea de por qué.

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

Entonces, después de cada "cálculo" y he agregado algo a mi cuadrícula imaginaria, necesito actualizar el panel para mostrar este nuevo elemento en mi cuadrícula. He intentado invalidar el panel justo antes de ladisplayGrid() Funciona pero parece causar aún más parpadeo.

losheartbeat() La función se está llamando actualmente en un hilo separado.

Aquí está mi nuevoPanel clase.

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

    }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta