Как предотвратить исключение ObjectDisposedException в C # при выходе из чертежа и приложения - PullRequest
1 голос
/ 18 сентября 2008

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

Ответы [ 2 ]

2 голосов
/ 18 сентября 2008

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

1 голос
/ 18 сентября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...