Как предотвратить исключение ObjectDisposedException в C # при завершении рисования и приложения

StackOverflow https://stackoverflow.com/questions/90662

  •  01-07-2019
  •  | 
  •  

Вопрос

Я студент CompSci и довольно новичок в C #, и я делал программу "Проблема Джозефуса" для класса, и я создал кнопку выхода, которая вызывает приложение.Exit() для выхода в любое время, но если C # все еще работает над рисованием и кнопка нажата, это вызывает ObjectDisposedExeception для графического объекта.Есть ли какой-нибудь способ предотвратить это?.Я думал о том, чтобы попробовать {} перехватить или изменить логическое значение, чтобы указать процессу рисования остановиться перед выходом, но я хочу знать, есть ли другое решение.

Это было полезно?

Решение

Этого не должно было случиться.Если кнопка создана в том же потоке, что и окно, они совместно используют перекачку сообщений, и обработчик рисования не может быть прерван для обработки кнопки выхода.Сообщение о том, что кнопка была нажата, будет помещено в очередь сообщений потока до тех пор, пока обработчик Paint не вернется.

Как правило, вам следует отложить рисование обработчику рисования (или переопределить OnPaint) и везде, где вам нужно обновить экран, вызывать метод Invalidate элемента управления.Это сообщает Windows, что область нуждается в перерисовке, и, как только все остальные сообщения будут обработаны, она сгенерирует WM_PAINT сообщение, которое в конечном итоге вызовет OnPaint, что, в свою очередь, вызовет событие Paint.

При анимации используйте System.Windows.Forms.Timer запускать каждый кадр, а не использовать поток. System.Threading.Timer обратные вызовы выполняются в threadpool, поэтому они всегда находятся не в том потоке для управления пользовательским интерфейсом.

Другие советы

Вам следует вызвать метод Close() Формы, содержащей кнопку, чтобы упорядоченно закрыть форму.Закрытие основной формы в любом случае приведет к закрытию приложения для вас.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top