2011-02-12 116 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

相關問題