Как предотвратить исключение ObjectDisposedException в C # при завершении рисования и приложения
-
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() Формы, содержащей кнопку, чтобы упорядоченно закрыть форму.Закрытие основной формы в любом случае приведет к закрытию приложения для вас.