Application.DoEvents()仅适用于WinForms吗?
是Application.DoEvents()
只是表单?Application.DoEvents()仅适用于WinForms吗?
我认为这个命令是用来确保所有的命令都是在处理之前,但现在在读the documentation之后,我不再确定了。
是的,它确实针对Windows Forms。但是,我认为应尽可能避免。
它通常被开发人员用作黑客,他们不希望将长时间运行放在不同的线程上,但这意味着他们正在引入重入问题,这很难追踪,以及在一段时间内仍然阻塞UI线程(如果这包括诸如文件操作之类的东西,则无法真正预测操作是否会足够快地完成,以至于没有用户可见的效果)。
+1000,不仅仅在你看来。根本没有理由使用它。 – 2011-02-12 11:14:54
没有WinForms,没有标准的事件队列。 (好吧,WPF中有一个事件队列,但这只是另一个框架)。
是的,它只适用于Windows窗体。它在控制台或ASP.NET应用程序中没有意义,因为没有消息循环。可以使用调度程序在WPF中执行此操作,如here所示。无论如何,我不会推荐使用DoEvents
,除了可能在快速和肮脏的应用程序,由于Jon解释的原因。
如果你要实现的目标是在等待着什么,以你的应用程序之外发生(例如,在某个目录被丢弃的文件),可能的解决方法将是定时器类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
你真的不应该以往任何时候都需要使用`Application.DoEvents`。你想解决什么问题?也许有人可以提出一个更好的方法。 – 2011-02-12 11:12:21
这不仅仅是“DoEvents”。这是整个班级。这就是为什么它是`System.Windows.Forms.Application` ... – Timwi 2011-02-12 11:54:47