Как исправить мерцание панели при перерисовке?

У меня есть панель, на которую я вложил подкласс и установилDoubleBuffered правда, мне постоянно нужно обновлять рисунок, но он мерцает и понятия не имею почему.

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

Поэтому после каждого «вычисления» и добавления чего-либо в мою воображаемую сетку мне нужно обновить панель, чтобы отобразить этот новый элемент в моей сетке. Я пытался сделать недействительной панель прямо передdisplayGrid() функция, но, кажется, вызывает еще больше мерцания.

heartbeat() функция в настоящее время вызывается в отдельном потоке.

Вот мой новыйPanel класс.

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

    }
}

Ответы на вопрос(2)

Ваш ответ на вопрос