12

使用的必要性是什么,什么Application.DoEvents时候应该使用?

4

3 回答 3

17

Application.DoEvents通常用于确保在 UI 线程上执行一些长时间运行的操作时定期处理事件。

更好的解决方案就是不这样做。当您需要更新 UI 时,在单独的线程上执行长时间运行的操作,编组到 UI 线程(使用Control.BeginInvoke/Invoke或 with )。BackgroundWorker

Application.DoEvents引入了重入的可能性,这可能导致非常难以理解的错误。

于 2009-07-12T06:25:01.827 回答
2

Windows 维护一个队列来保存各种事件,例如单击、调整大小、关闭等。当控件响应事件时,所有其他事件都保留在队列中。因此,如果您的应用程序处理按钮单击的时间过长,则应用程序的其余部分似乎会冻结。因此,您的应用程序在为响应事件而执行一些繁重的处理时,可能会出现无响应的情况。虽然理想情况下您应该以异步方式进行大量处理以确保 UI 不会冻结,但快速简单的解决方案是定期调用 Application.DoEvents() 以允许将未决事件发送到您的应用程序。

对于好的 Windows 应用程序,最终用户不喜欢任何形式的应用程序在执行更大/重量级操作时冻结。用户总是希望应用程序以响应式的方式平稳运行,而不是冻结 UI。但是在谷歌搜索之后,我发现 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
于 2012-10-15T17:10:11.373 回答
1

恕我直言,您不应该使用它,因为您最终可能会遇到非常意外的行为。刚刚生成的代码没问题。诸如您正在再次执行您当前所在的事件处理程序之类的事情,因为用户按下了两次键等等等。如果您想刷新控件以显示当前进程,您应该显式调用 .Update 在该控件上而不是调用 Application .DoEvents。

于 2009-07-12T06:16:54.697 回答