Application.DoEvents()仅适用于WinForms吗?

时间:2011-02-12 11:09:11

标签: c# .net winforms doevents

Application.DoEvents()仅用于表单吗?

我认为此命令用于确保之前的所有命令都已处理,但现在在阅读the documentation之后,我不再确定了。

4 个答案:

答案 0 :(得分:15)

是的,它真的针对的是Windows Forms。但是,在我看来,应该尽可能避免。

它通常被开发人员用作黑客,他们不希望将长期运行的操作置于不同的线程上......但这意味着他们会引入可能很难跟踪的重入问题向下,以及在某些时候仍然阻止UI线程(如果包含类似文件操作的内容,则无法真正预测操作是否会足够快地完成以使用户无法看到效果)。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

如果你想要实现的是等待在你的应用程序之外发生的事情(例如,要放在某个目录中的文件),可能的解决方法是 Timer 类。 System.Timers 名称空间。

一个例子(基于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

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

答案 3 :(得分:2)

是的,它仅适用于Windows Forms。它在控制台或ASP.NET应用程序中没有意义,因为没有消息循环。可以使用调度程序在WPF中执行此操作,如here所示。无论如何,我建议不要使用DoEvents,除非在快速而肮脏的应用程序中,由于Jon解释的原因。

相关问题