2011-02-12 121 views
7

Application.DoEvents()只是表单?Application.DoEvents()仅适用于WinForms吗?

我认为这个命令是用来确保所有的命令都是在处理之前,但现在在读the documentation之后,我不再确定了。

+4

你真的不应该以往任何时候都需要使用`Application.DoEvents`。你想解决什么问题?也许有人可以提出一个更好的方法。 – 2011-02-12 11:12:21

+0

这不仅仅是“DoEvents”。这是整个班级。这就是为什么它是`System.Windows.Forms.Application` ... – Timwi 2011-02-12 11:54:47

回答

14

是的,它确实针对Windows Forms。但是,我认为应尽可能避免。

它通常被开发人员用作黑客,他们不希望将长时间运行放在不同的线程上,但这意味着他们正在引入重入问题,这很难追踪,以及在一段时间内仍然阻塞UI线程(如果这包括诸如文件操作之类的东西,则无法真正预测操作是否会足够快地完成,以至于没有用户可见的效果)。

+1

+1000,不仅仅在你看来。根本没有理由使用它。 – 2011-02-12 11:14:54

3

没有WinForms,没有标准的事件队列。 (好吧,WPF中有一个事件队列,但这只是另一个框架)。

2

是的,它只适用于Windows窗体。它在控制台或ASP.NET应用程序中没有意义,因为没有消息循环。可以使用调度程序在WPF中执行此操作,如here所示。无论如何,我不会推荐使用DoEvents,除了可能在快速和肮脏的应用程序,由于Jon解释的原因。

3

如果你要实现的目标是在等待着什么,以你的应用程序之外发生(例如,在某个目录被丢弃的文件),可能的解决方法将是定时器System.Timers的命名空间。

一个例子(基于MSDN):在MSDN

Private Sub SetTimer() 
    Dim aTimer As New System.Timers.Timer 
    AddHandler aTimer.Elapsed, AddressOf OnTimedEvent 
    aTimer.Interval = 5000 
    aTimer.Enabled = True 

    Console.WriteLine("Press q to exit") 
    While Console.Read <> Asc("q") 
    End While 
End Sub 

Private Sub OnTimedEvent(ByVal source As Object, ByVal e As ElapsedEventArgs) 
    'Do the job here 
    Console.WriteLine("HELLO WORLD!") 
    'Don't forget to disable the timer if you don't need it anymore 
    'Source.Enabled = False 
End Sub 

更多信息:http://msdn.microsoft.com/en-us/library/system.timers.timer%28v=vs.71%29.aspx