我有一個簡單的「工作」表單,它在自己的線程上運行,以保持用戶通知應用程序在長時間運行操作期間沒有死亡。爲了讓工作表更新,我必須插入一個DoEvents()
呼叫。DoEvents是否僅影響當前線程?
我很好奇,這隻會爲當前線程泵送消息,還是會爲整個應用程序執行?我希望主窗口在操作完成之前保持無響應狀態,所以我很好奇行爲。以下是工作表格的代碼。
只是要清楚,我很好,我有代碼,但我想知道DoEvents()
行爲與線程。
Public Class frmWorking
''' <summary>
''' Creates and starts a new thread to handle the Working Dialog
''' </summary>
''' <returns>The thread of the Working dialog.</returns>
''' <remarks></remarks>
Public Shared Function StartWait() As WorkingFromToken
Dim th As New Threading.Thread(AddressOf ShowWait)
Dim token As New WorkingFromToken
th.Start(token)
Return token
End Function
Private Shared Sub ShowWait(token As WorkingFromToken)
Dim frm As New frmWorking
Try
frm.Show()
Do
If frm.txtWait.Text.Length > 45 Then
frm.txtWait.Text = "Working"
Else
frm.txtWait.Text &= "."
End If
Windows.Forms.Application.DoEvents()
Threading.Thread.Sleep(250)
Loop While token.Running
frm.Hide()
Catch ex As Threading.ThreadAbortException
Threading.Thread.ResetAbort()
frm.Hide()
Return
End Try
End Sub
End Class
擁有多個UI線程並不是一個好主意。 – SLaks 2011-06-07 14:46:19
即使在你的控制環境中,「Abort」也是危險的,應該避免。輪詢「取消」標誌更安全。 – SLaks 2011-06-07 14:48:09
@SLacks,其實我只是改變了這種方法,我想我只是留在那裏的catch,因爲我不確定是否有其他生成的ThreadAbortException,除了顯式調用Thread.Abort。 – Kratz 2011-06-07 14:54:02