我有一个简单的“工作”表单,它在自己的线程上运行,以通知用户应用程序在长时间运行期间没有死亡.为了使工作表单更新,我必须插入一个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
DoEvents只会抽取当前的UI线程.
但是,我不推荐你的方法.
相反,您应该在后台线程上完成工作,并在UI线程上显示模式进度表单并使用BeginInvoke或BackgroundWorker更新它.
