我有一个简单的“工作”表单,它在自己的线程上运行,以保持用户通知应用程序在长时间运行操作期间没有死亡。为了让工作表更新,我必须插入一个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