Как отметил Нейл, вам не нужно (и не нужно) создавать новый объект Graphics в каждой итерации цикла.Это относительно дорогие ресурсы, и их не следует создавать невольно.
Кроме того, вы не должны рисовать так внутри обработчика нажатия кнопки, вызывая CreateGraphics.Это может привести к проблемам, особенно к тому, что ваш рисунок «отменяется», когда вызывается обработчик рисования (т. Е. Каждый раз, когда окно получает сообщение WM_PAINT и обновляется).Вы должны сделать все свои рисунки, переопределив OnPaint и просто вызывая Invalidate (), когда вам нужно обновить форму.
Что касается мерцания, то установка DoubleBuffered в значение true обычно позаботится об этом, но переходя на собственноедвойная буферизация тривиальна.Попробуйте.Также поймите, что рисование в таком цикле, вероятно, не то, что вы хотите делать.Используйте таймер, если вы хотите обновить один раз за некоторый интервал.Ваш код выполняется так быстро, как может выполняться цикл, что обычно нежелательно.
private void someTimer_Tick( ... )
{
Invalidate();
}
protected override void OnPaint( PaintEventArgs e )
{
using( var tempBmp = new Bitmap( ... ) )
using( var g = Graphics.FromImage( tempBmp ) )
{
// draw to tempBmp
e.Graphics.DrawImage( tempBmp, new Point( 0, 0 ) );
}
}