Можно ли вызывать "Application.DoEvents", пока модальный диалог прогресса запущен?

У меня длительный процесс, который я не могу запустить асинхронно, поэтому, как и в случае с Explorer, когда вы копируете файлы, у меня есть диалоговое окно прогресса. Я показываю диалог модально, затем выполняю операции (мы будем называть его копированием файлов, чтобы сохранить его абстрактным), обновляю диалог прогресса и добавляю сообщения с помощью Application.DoEvents(), чтобы сохранять основной кадр приложения и реагировать на него.

Поскольку диалоговое окно является модальным, пользователь не может делать ничего, кроме просмотра или отмены. Другими словами, они не могут выбрать пункт меню или нажать любую кнопку.

Я всегда верил, что Application.DoEvents чрезвычайно злой, потому что вы можете повторно ввести код, который вы не намеревались возвращать. Но в этом случае, поскольку диалог прогресса является модальным, я не вижу причины, по которой это плохое или опасное решение.

Я что-то пропускаю или выкачиваю сообщения с помощью Application.DoEvents - законная вещь, которую нужно сделать с модальным диалогом?

2 ответа

Я не вижу особой проблемы с этим ограниченным использованием DoEvents. Мы успешно используем его в очень ограниченных ситуациях, таких как этот, когда фоновая обработка не возможна.

Обычно ваш поток пользовательского интерфейса в приложении будет качать сообщения. Теперь, даже если модальные диалоги запускают свой собственный насос сообщений, это просто для того, чтобы сохранить поведение вызова, как и ожидалось (например, вызов возвращается только тогда, когда модальное диалоговое окно закрыто), нет необходимости иметь дело с модальным диалогом как таковым. (См. Также это сообщение в блоге из блога "старая новая вещь").

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

Другие вопросы по тегам