Application.DoEvents,什么时候需要,什么时候不需要?

时间:2009-07-12 06:10:59

标签: doevents

使用Application.DoEvents的必要性以及何时应该使用它?

3 个答案:

答案 0 :(得分:17)

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

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

Application.DoEvents引入了重新入侵的可能性,这可能导致很难理解的错误。

答案 1 :(得分: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

答案 2 :(得分:1)

Imho你应该更少从不使用它,因为你最终可能会遇到非常意外的行为。 刚生成的代码没问题。像你这样的事情再次执行你当前所在的事件处理程序,因为用户按了两次键等等。 如果要刷新控件以显示当前进程,则应该在该控件上显式调用.Update,而不是调用Application.DoEvents。