Application.DoEvents (); - PullRequest
       4

Application.DoEvents ();

4 голосов
/ 22 февраля 2009

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

Ответы [ 3 ]

12 голосов
/ 22 февраля 2009

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

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

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

1 голос
/ 22 февраля 2009

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

1 голос
/ 22 февраля 2009

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

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