Application.DoEvents, когда это необходимо, а когда нет? - PullRequest
12 голосов
/ 12 июля 2009

В чем необходимость использования Application.DoEvents и когда мы должны его использовать?

Ответы [ 3 ]

17 голосов
/ 12 июля 2009

Application.DoEvents обычно используется для обеспечения периодической обработки событий при выполнении длительной операции в потоке пользовательского интерфейса.

Лучшее решение - просто не делать этого. Выполняйте длительные операции в отдельных потоках, упорядочивая поток UI (используя Control.BeginInvoke / Invoke или BackgroundWorker), когда вам необходимо обновить интерфейс.

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

2 голосов
/ 15 октября 2012

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

Для хорошего Windows-приложения конечному пользователю не нравится, когда какая-либо форма приложения «зависает» при выполнении более крупной или тяжелой операции. Пользователь всегда хочет, чтобы приложение работало гладко и быстро, а не зависало. Но после поиска в Google я обнаружил, что Application.DoEvents () не рекомендуется использовать в приложениях чаще, поэтому вместо этого лучше использовать BackGround Worker Thread для выполнения длительных задач без зависания окон.

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

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        For i As Integer = 0 To 1000
            System.Threading.Thread.Sleep(100)
            ListBox1.Items.Add(i.ToString())
            Application.DoEvents()
        Next
    End Sub
1 голос
/ 12 июля 2009

Имхо, вы никогда не должны использовать его, так как это может привести к очень неожиданному поведению. Просто сгенерированный код в порядке. Такие вещи, как вы снова запускаете обработчик событий, в котором вы находитесь, потому что пользователь дважды нажал клавишу и т. Д. И т. Д. Если вы хотите обновить элемент управления для отображения текущего процесса, вам следует явно вызвать .Update для этого элемента управления вместо вызова Application.DoEvents.

...