Application.DoEvents();


4

Как сохранить свою форму на C#, которая, скажем, включена в цикл, от блокировки? Я вызываю Application.DoEvents(); перед циклом или после? Из того, что я слышал, используя метод DoEvents, мое приложение блокируется.

11

Вы не должны использовать Application.DoEvents(), чтобы ваше приложение реагировало.

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

Вместо этого вы должны использовать поток BackgroundWorker для выполнения длительного процесса, а затем, как только действие будет выполнено, выполните любые дополнительные действия. Например, как только кнопка нажата, вы запустите рабочий поток, а затем отключите кнопку, чтобы ее нельзя было снова нажать. Как только рабочий поток завершится, вы снова включите кнопку.


1

Существует несколько способов: это (DoEvents) просто заставляет насос сообщений обрабатывать сообщения. Некоторые люди помещают Thread.Sleep в конце цикла (всегда внутри цикла, хотя) в потоке. Что именно вы делаете в своем потоке, потому что может быть лучший способ достичь цели целиком?


1

Если процесс вызывает интерфейс блокировки для неприемлемого количества времени, попробуйте использовать отдельную нить (или создать его, использовать пул потоков, или использовать BackgroundWorker класс.