Подтвердить что ты не робот

Application.DoEvents, когда это необходимо, а когда нет?

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Для хорошего приложения Windows конечный пользователь не любит, когда какая-либо форма приложения замерзает при выполнении операции более крупного/тяжеловесного режима. Пользователь всегда хочет, чтобы приложение выполнялось плавно и реагировать, а не замораживать пользовательский интерфейс. Но после googling я обнаружил, что 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

Ответ 3

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