Этого не должно быть. Если кнопка создается в том же потоке, что и окно, они используют общий поток сообщений, и обработчик Paint не может быть прерван для обработки кнопки выхода. Сообщение о нажатии кнопки будет помещено в очередь в очереди сообщений потока, пока не вернется обработчик Paint.
Как правило, вы должны отложить рисование на обработчик Paint (или переопределить OnPaint), а везде, где вам нужно обновить экран, вызвать метод Invalidate элемента управления. Это говорит Windows, что область требует перекраски, и, как только все другие сообщения будут обработаны, она сгенерирует сообщение WM_PAINT
, которое в конечном итоге вызовет OnPaint, что, в свою очередь, вызовет событие Paint.
При анимации используйте System.Windows.Forms.Timer
для запуска каждого кадра вместо использования потока. System.Threading.Timer
обратные вызовы выполняются в пуле потоков, поэтому они всегда находятся в неправильном потоке для управления пользовательским интерфейсом.