Чтобы узнать, что люди говорят о DoEvents, вот описание того, что может произойти.
Допустим, у вас есть какая-то форма с данными на ней, и ваше долгосрочное событие сохраняет ее в базе данных или создает отчет на ее основе. Вы начинаете сохранять или генерировать отчет, а затем периодически вызываете DoEvents, чтобы экран продолжал рисовать.
К сожалению, экран не просто рисует, он также реагирует на действия пользователя. Это связано с тем, что DoEvents останавливает то, что вы делаете сейчас, для обработки всех сообщений Windows, ожидающих обработки вашим приложением Winforms. Эти сообщения включают в себя запросы на перерисовку, а также любой ввод текста, нажатие и т. Д.
Так, например, пока вы сохраняете данные, пользователь может сделать такие вещи, как заставить приложение отобразить модальное диалоговое окно, которое совершенно не связано с длительной задачей (например, Справка-> О программе). Теперь вы реагируете на новые действия пользователя внутри уже выполняющейся задачи, выполняющейся долго. DoEvents вернется, когда будут завершены все события, которые ожидали, когда вы его вызвали, и тогда ваше долгосрочное задание продолжится.
Что если пользователь не закроет модальное диалоговое окно? Ваше долгосрочное задание ждет вечно, пока этот диалог не будет закрыт. Если вы фиксируете базу данных и проводите транзакцию, теперь вы держите транзакцию открытой, пока пользователь пьет кофе. Либо ваша транзакция истекает и вы теряете свою постоянную работу, либо транзакция не истекает, и вы потенциально можете заблокировать других пользователей БД.
Здесь происходит то, что Application.DoEvents делает ваш код повторным. См. Определение википедии здесь . Обратите внимание на некоторые моменты в верхней части статьи, что для кода, подлежащего повторному вводу, это:
- Не должно содержать статических (или глобальных) непостоянных данных.
- Должен работать только с данными, предоставленными ему вызывающим абонентом.
- Не должен полагаться на блокировки одноэлементных ресурсов.
- Не должен вызывать не входящие компьютерные программы или процедуры.
Маловероятно, что долго выполняющийся код в приложении WinForms работает только с данными, передаваемыми вызывающему методу, не хранит статические данные, не удерживает блокировок и вызывает только другие повторяющиеся методы.
Как многие здесь говорят, DoEvents может привести к некоторым очень странным сценариям в коде. Ошибки, к которым это может привести, могут быть очень трудно диагностировать, и ваш пользователь вряд ли скажет вам: «О, это могло произойти, потому что я нажал эту несвязанную кнопку, пока ждал ее сохранения».