Лучшие практики для закрытия winforms: очистка и последние события приложений - PullRequest
4 голосов
/ 21 августа 2010

У меня есть несколько небольших приложений winforms C # (хотя это должно в равной степени относиться к любому приложению .NET), которые должны выполнять несколько небольших задач, когда они закрыты.

Я использовал.FormClosing событие для создания таких вещей, как запись текущего файла настроек и ожидание завершения фоновых потоков и т. Д.

В связи с лучшими практиками пришло два вопроса:

  • Нужно ли останавливать таймеры (или аналогичные задачи) при закрытии формы?Зная, что завершение приложения должно избавиться от таймера, будет ли хорошей идеей выдать timer.Stop() при закрытии формы?Возможно ли, после ввода метода .FormClosing, что таймер может сработать снова?

  • Должны ли задачи, выполняемые в последнюю минуту, например, написание файла настроек, быть в .FormClosing или.FormClosed событие (или в другом месте) и почему?

Извините за объединение этих вопросов, но я чувствовал, что они были достаточно тесно связаны, чтобы гарантировать единственную ветку о правильном закрытии формы.на основе приложения.

Ответы [ 2 ]

4 голосов
/ 21 августа 2010

для гарантии одного потока

Ну, вы уже ответили на свой вопрос :) Такие события, как FormClosing и событие Tick таймера, все выполняются в одном потоке. Таймер не может «разбиться» на поток и запустить событие Tick, ваш поток занят очисткой. Событие Tick не будет запущено до тех пор, пока ваш поток снова не перейдет в режим ожидания, когда он завершит работу обработчика события и повторно войдет в цикл обработки сообщений.

Но прежде чем это произойдет, форма уничтожит себя, избавившись от всех своих элементов управления и компонентов. Это положит конец любой возможности для запуска события Tick таймера. Нет необходимости явно останавливать () его.

Это не относится к System.Timers.Timer или другим асинхронным компонентам, таким как BackgroundWorker. очень важно, чтобы вы остановили их до закрытия формы. Если вы этого не сделаете, то ваш код обычно будет бомбить исключение ObjectDisposedException. Особенно System.Timers.Timer трудно очень трудно остановить, он может запланировать поток, который вызывает обработчик события Elapsed за микросекунду до того, как пользователь закрывает форму. Большой Кабум, когда это произойдет. Не используйте его.

3 голосов
/ 21 августа 2010

Должен ли я остановить таймер?

Не совсем, но это тоже не повредит.

Может ли таймер срабатывать после закрытия формы?

Сложно.Не обычно, но если какой-то код в цепочке закрытия вызывает Application.DoEvents (), я не исключаю этого.Всегда хорошая идея для защиты вашего таймера-обработчика.

Должны ли задачи на последней минуте быть в .FormClosing или .FormClosed?

FormClosing условен, его основная функцияэто показать "Сохранить первым?"коробка или подобное.Я бы поместил все в FormClosed, если только он действительно не должен быть более ранним (то есть он требует, чтобы другие компоненты / элементы управления были активными и активными).

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